2012-05-03 42 views
0

我目前正在使用Windows窗體GUI的應用程序。應用程序的主要工作將在另一個線程上執行 - 但它可能取決於表單的狀態。
正因爲如此,在創建線程之前,我必須確保表單完全加載了,。此外,我需要確保線程在之前終止表單開始關閉。當表單加載並在表單關閉之前執行代碼

此問題的可能解決方案可能會覆蓋OnShownOnFormClosing方法。
OnShow方法是否只有在窗體的所有資源都被加載後才真正被調用?那麼OnFormClosing - 我可以確定在這個方法中執行的任何代碼將在
之前執行表單開始關閉/處置嗎?

回答

2

我建議你通過的WinForms事件順序讀MSDN上張貼:

http://msdn.microsoft.com/en-us/library/86faxx0d.aspx

+0

這是一個有趣的閱讀,但不幸的是,似乎即使是第一個事件('OnClosing' /'OnFormClosing')在表單處理後被觸發。我唯一能想到的就是重寫close方法...... – Acidic

+0

OnClosing在處理完事後肯定不會被解僱.... – debracey

2

Windows窗體事件可能會非常棘手,它們觸發的順序不可靠。例如,「顯示」事件旨在僅在表單第一次顯示時觸發一次,而且僅在昨天,我發現了一種方法,可以在正確的時間通過操作Form.Visible標誌完全防止該事件觸發。

所以,你需要對你的需求有相當的具體。例如 - 當你說'完全加載'時,你是什麼意思?創建控件,表單可見,表單構造函數完成執行?

同樣,FormClosing事件可能會被主要aUI線程中未處理的異常繞過,這會導致在沒有事件觸發的情況下移除表單。

我建議不要假設這些事件。使您的工作線程能夠處理表單狀態不可用或未準備好。不知道你的具體要求,很難更具體。

+0

當談到這件事時,我也遇到了一些不可靠性,但對我來說,似乎如果我能減少異常超出這個水平的機會,這可能就足夠了。我不打算在表單本身之外做任何超出基本的事情。與窗體的唯一外部交互可能如下所示:'form.Invoke(form.Refresh)'或'form.BeginInvoke(form.Refresh)'。 – Acidic

0

您是否嘗試過用你的主要的WinForm的構造函數的InitializeComponent和使用的OnLoad(稱爲每當一切加載)?

相關問題