2008-09-18 46 views
1

我是一名CompSci学生,在C#上相当新颖,当时我正在为一个类做一个“Josephus Problem”程序,并创建了一个Exit按钮Application.Exit()随时退出,但如果C#仍在绘画并且按下按钮,则会为Graphics对象引发ObjectDisposedExeception。有什么办法可以防止这种情况发生?我正在考虑尝试{}捕捉或更改布尔值,以告诉绘制过程在退出之前停止,但是我想知道是否有另一种解决方案。如何防止C#中的ObjectDisposedException在绘图和应用程序退出时

回答

1

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

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

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

2

您应该被称为包含按钮的窗体的Close()方法,以便按顺序关闭窗体。无论如何,关闭主窗体都会导致应用程序退出。