2008-09-18 41 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()方法,以便按順序關閉窗體。無論如何,關閉主窗體都會導致應用程序退出。