我一直遇到这个问题。 这是我的代码。
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窗口。有两个按钮,代码中显示了事件。
当我按两次向上按钮时,它可以正常工作。这会将两个PNG保存到位置
“C:\ Folder \ image0.png”和“C:\ Folder \ image1.png”
第三次按下按钮时,应再次将其保存到“C:\ Folder \ image0.png”。 相反,它给出了“GDI +中发生一般错误”的异常。
之前我遇到过类似的问题,并通过添加以下两行解决了这个问题:
GC.Collect();
GC.WaitForPendingFinalizers();
这次没用。
答案 0 :(得分:0)
要避免BitmapImage
创建的文件锁,您必须处理更多初始化。根据{{3}},它可以这样做(从他们的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;
}