我是一名 CompSci 学生,对 C# 相当陌生,当时我正在为一堂课做一个“约瑟夫问题”程序,我创建了一个退出按钮,可以调用 Application.Exit() 随时退出,但如果 C# 仍然正在绘画并且按下按钮,它会抛出 Graphics 对象的 ObjectDisposeException。有什么办法可以防止这种情况发生吗?我正在考虑尝试捕获或更改布尔值来告诉绘画进程在退出之前停止,但我想知道是否还有其他解决方案。

有帮助吗?

解决方案

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

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top