异常不会被抓住

时间:2016-07-10 19:31:29

标签: c# winforms

我有自定义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附近的奇怪位置。或完全崩溃(如果没有调试)
enter image description here
.NET 4.6.1(Project 4.0),Win7 x64,VS 2015

1 个答案:

答案 0 :(得分:1)

有人已经在评论中提到它并且应该可能使它成为答案但你应该使用lock关键字锁定图像对象,以便另一个线程不能同时尝试更改它。

您可以在此处阅读更多内容:https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx