2011-08-06 84 views
0
Form1.button_Click(...) { 
    // Show a dialog form, which runs a method <CheckBalance()> on it's OnLoad Event. 
    var modemDialog = new ModemDialog("COM25"); 
    modemDialog.ShowDialog(); 
    // the user can't see this dialog form until the method <CheckBalance()> terminates. 
} 

是否可以先顯示對話框然後運行指定的方法? 謝謝。窗體Visiblity問題

回答

1

這是正確的和預期的。 Winforms UI本質上是單線程的。在表單加載事件中使用類似「CheckBalance」的函數調用將阻止窗體在表單加載事件完成之前顯示。根據任務的持續時間,你有多種選擇給您:

  1. 如果它是一個快速任務,展示形式
  2. 如果它的東西,用戶可能希望之前提前計算的時間它啓動並將其移動到新表單上的按鈕,因此僅根據用戶的請求進行計算。
  3. 如果長時間運行的任務需要一些時間,則需要將其移至另一個線程。建議使用BackgroundWorker
0

OnLoad發生之前所示的形式,讓您初始化形式和變量,哪些不是,這意味着它是同步的。直到您從該功能返回後,表單纔會顯示。

如果您想異步運行CheckBalance()方法,那麼您可以使用一些技術,例如使用線程,ThreadPool或Tasks API將該工作轉移到後臺線程,並立即返回以便顯示錶單。

下面是一個使用任務來執行相同的操作的一個例子,但異步使形式立即顯示:

Action<object> action =() => { CheckBalance(); }; 
new Task(action).Start(); 

請注意,如果您訪問UI線程,你需要提防線程安全和調用。

0

最簡單的方法,以確保運行CheckBalance之前窗體是可見的形式加載處理程序使用此代碼:

this.BeginInvoke((Action)(() => this.CheckBalance())); 

這將CheckBalance方法的執行推到UI線程消息在所有前面的UI代碼完成之後,泵將會執行。

其他的都是正確的,雖然該UI將仍然被封鎖作爲CheckBalance執行。你可能想在後臺線程上運行它來防止這種情況發生。

+0

謝謝確實,工作就像一個魅力。 – Dohamsg