我有自定义Paint
处理程序,可以处理图像
void MainForm_Paint(object sender, PaintEventArgs e) {
try {
int x = (Width - img.Width) / 2;
int y = (Height - img.Height) / 2;
e.Graphics.Clear(BackColor);
e.Graphics.DrawImage(img, x, y);
} catch { }
}
try-catch
因为img
使用System.Timers.Timer
每10毫秒更改一次
例如,它只是连续绘制一个像素。
void tick(object sender, System.Timers.ElapsedEventArgs e) {
timer.Stop();
try {
img?.Dispose();
img = new Bitmap(100, 100);
Graphics g = Graphics.FromImage(img);
for (int i = 0; i < progress; i++)
g.FillRectangle(Brushes.Black, i % 100, (int)Math.Floor(i / 100f), 1, 1);
if (++progress == 10000)
progress = 0;
g.Dispose();
Invalidate();
} catch {}
timer.Start();
}
因此,有时表单会失效并且Paint
事件会引发。当tick
处理新图片时可能会发生这种情况,因此可能会处置img
。在这种情况下可以跳过Paint
,但catch
代码不会被调用,因此异常发生在progress==3500
附近的奇怪位置。或完全崩溃(如果没有调试)
.NET 4.6.1(Project 4.0),Win7 x64,VS 2015
答案 0 :(得分:1)
有人已经在评论中提到它并且应该可能使它成为答案但你应该使用lock关键字锁定图像对象,以便另一个线程不能同时尝试更改它。
您可以在此处阅读更多内容:https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx