28

このファイルのハンドルを解放するにはどうすればよいですか?

imgのタイプは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.
}

解決


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;
}
4

2 に答える 2

34

MSDNフォーラムで答えを見つけました。

キャッシュオプションがBitmapCacheOption.OnLoadとして設定されていない限り、ビットマップストリームは閉じられません。したがって、次のようなものが必要です。

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

また、上記の方法を使用してImageSourceを取得すると、ソースファイルはすぐに閉じられます。

MSDNソーシャルフォーラムを参照してください

于 2012-04-25T16:19:05.967 に答える
1

私は特に厄介な画像でこれに関する問題に遭遇し続けました。受け入れられた答えは私にはうまくいきませんでした。

代わりに、ストリームを使用してビットマップにデータを入力しました。

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

これにより、ファイルハンドルが解放されました。

于 2017-03-07T19:55:49.230 に答える