绘图和应用程序退出时如何防止C#中的ObjectDisposedException

时间:2020-03-06 14:20:16  来源:igfitidea点击:

我是CompSci的学生,并且是C#的新手,我正在为一个班级做一个"约瑟夫问题"程序,并且我创建了一个退出按钮,该按钮可以随时调用Application.Exit()退出,但是如果Cis仍然有效在绘画时,按下按钮会为Graphics对象抛出一个ObjectDisposedExeception。有什么办法可以防止这种情况?我当时想尝试try {} catch或者更改一个布尔值以告知绘画过程在退出之前停止,但是我想知道是否还有其他解决方案。

解决方案

应该调用包含按钮的Form的Close()方法,以便有序关闭表单。关闭主窗体将使该应用程序仍然为我们退出。

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

通常,应该将绘画推迟到Paint处理程序(或者重写OnPaint),然后在需要更新屏幕的其他任何地方调用控件的Invalidate方法。这告诉Windows某个区域需要重新粉刷,一旦处理完所有其他消息,它将生成一个" WM_PAINT"消息,该消息最终将调用OnPaint,这又将触发Paint事件。

如果设置动画,请使用" System.Windows.Forms.Timer"触发每个帧,而不要使用线程。 System.Threading.Timer回调在线程池上执行,因此它们始终在错误的线程上操作UI。