2012-04-25 31 views
22

Làm cách nào để có thể giải phóng xử lý trên tệp này?Xử lý phát hành trên hồ sơ. ImageSource từ BitmapImage

img là loại System.Windows.Controls.Image

private void Load() 
{ 
    ImageSource imageSrc = new BitmapImage(new Uri(filePath)); 
    img.Source = imageSrc; 
    //Do Work 
    imageSrc = null; 
    img.Source = null; 
    File.Delete(filePath); // File is being used by another process. 
} 

Giải pháp


private void Load() 
{ 
    ImageSource imageSrc = BitmapFromUri(new Uri(filePath)); 
    img.Source = imageSrc; 
    //Do Work 
    imageSrc = null; 
    img.Source = null; 
    File.Delete(filePath); // File deleted. 
} 



public static ImageSource BitmapFromUri(Uri source) 
{ 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.UriSource = source; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
    return bitmap; 
} 
+1

Giải pháp tốt. Bạn đã lưu ngày của tôi :) – gisek

+0

3 dòng này là gì: img.Source = imageSrc; // Làm việc imageSrc = null; img.Source = null; – MonsterMMORPG

+0

@MonsterMMORPG đừng lo lắng về chúng ... bitmap.CacheOption = BitmapCacheOption.OnLoad; là phần ma thuật. – NitroxDM

Trả lời

24

Tìm thấy câu trả lời trên MSDN diễn đàn.

Luồng bitmap không được đóng trừ khi tùy chọn bộ nhớ đệm được đặt là BitmapCacheOption.OnLoad. Vì vậy, bạn cần một cái gì đó như thế này:

public static ImageSource BitmapFromUri(Uri source) 
{ 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.UriSource = source; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
    return bitmap; 
} 

Và khi bạn nhận được một ImageSource sử dụng phương pháp trên, nguồn tập tin sẽ đóng cửa ngay lập tức.

see MSDN social forum

+0

Tốt về bạn. – NitroxDM

+0

nếu tôi sử dụng mã này có bất kỳ thay đổi nào về Tăng bộ nhớ của ứng dụng không? –

0

Tôi tiếp tục chạy vào các vấn đề với điều này trên một hình ảnh đặc biệt đáng lo ngại. Câu trả lời được chấp nhận không làm việc cho tôi.

Thay vào đó, tôi đã sử dụng một dòng suối để cư bitmap:

using (FileStream fs = new FileStream(path, FileMode.Open)) 
{ 
    bitmap.BeginInit(); 
    bitmap.StreamSource = fs; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
} 

này gây ra các tập tin xử lý sẽ được phát hành.

Các vấn đề liên quan