0

私はこれでかなりの問題を抱えています。これが私のコードです。

    int frame = 0;

    //This is a wpf button event
    private void up_Click(object sender, RoutedEventArgs e)
    {
        frame++;
        LoadPic();
    }
    private void LoadPic()
    {
        string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
        Bitmap bmp = new Bitmap(302, 170);
        bmp.Save(fn);
        bmp.Dispose();

        //Picebox is a wpf Image control
        Picbox.Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(fn));
    }

    private void down_Click(object sender, RoutedEventArgs e)
    {
        frame--;
        LoadPic();
    }

プログラムを起動すると、wpf ウィンドウが開きます。コードに示されているイベントには 2 つのボタンがあります。

アップボタンを2回押すと正常に動作します。これにより、2 つの PNG がその場所に保存されます

「C:\Folder\image0.png」と「C:\Folder\image1.png」

ボタンを 3 回押すと、「C:\Folder\image0.png」に再度保存されます。代わりに、「GDI+ で一般的なエラーが発生しました」という例外が発生します。

以前にも同様の問題があり、次の2行を追加して解決しました。

GC.Collect();
GC.WaitForPendingFinalizers();

今回はうまくいきませんでした。

4

1 に答える 1

0

作成するファイルロックを回避するBitmapImageには、もう少し初期化を行う必要があります。SO に関するこの質問によると、このように実行できます (VB.Net コードから C# に移植)。

private void LoadPic()
{
    string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
    Bitmap bmp = new Bitmap(302, 170);
    bmp.Save(fn);
    bmp.Dispose();

    var img = new System.Windows.Media.Imaging.BitmapImage();
    img.BeginInit();
    img.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
    img.UriSource = new Uri(fn);
    img.EndInit();
    Picbox.Source = img;
}
于 2013-09-21T17:57:33.787 に答える