1

我是 CompSci 的学生,在 C# 方面相当新,我正在为一个班级做一个“约瑟夫问题”程序,我创建了一个退出按钮,它调用 Application.Exit() 随时退出,但如果 C# 仍然处理绘画并按下按钮,它会为 Graphics 对象引发 ObjectDisposedException。有什么办法可以防止这种情况吗?我在考虑 try{}catch 或更改一个布尔值来告诉绘画过程在退出之前停止,但我想知道是否有其他解决方案。

4

2 回答 2

2

您应该调用包含按钮的表单的 Close() 方法,以便有序地关闭表单。关闭主窗体将导致应用程序为您退出。

于 2008-09-18T07:17:36.303 回答
1

这应该是不可能发生的。如果按钮是在与窗口相同的线程上创建的,它们共享一个消息泵,并且 Paint 处理程序不能被中断来处理退出按钮。单击按钮的消息将在线程的消息队列中排队,直到 Paint 处理程序返回。

通常,您应该将绘画推迟到 Paint 处理程序(或覆盖 OnPaint),并且在您需要更新屏幕的任何其他地方,调用控件的 Invalidate 方法。这告诉 Windows 一个区域需要重新绘制,并且一旦处理了所有其他消息,它将生成一条WM_PAINT消息,该消息最终将调用 OnPaint,而 OnPaint 又将触发 Paint 事件。

如果是动画,请使用 aSystem.Windows.Forms.Timer来触发每一帧,而不是使用线程。System.Threading.Timer回调在线程池上执行,因此它们总是在错误的线程上操作 UI。

于 2008-09-18T14:44:55.853 回答