2011-03-29 23 views
2

我有我使用form.showDialog()顯示的窗體,並在主窗體中我有一個線程,每隔x秒發送一條消息。我注意到,當我在窗口中打開使用ShowDialog打開的新窗體時,該線程無法運行。即使使用ShowDialog,我如何使它繼續運行?當使用form.ShowDialog()在mainform中的線程不起作用

代碼:

codeshowAllScriptsWindow window = new showAllScriptsWindow(this); 
window.Show(); 

,並在MainForm中我有不斷髮送郵件,但因爲這個的ShowDialog的停止的線程。請注意,當我使用show()時,它不會發生。

+3

您可能需要閱讀某些代碼。 – 2011-03-29 20:03:18

+0

'code'showAllScriptsWindow window = new showAllScriptsWindow(this); window.Show();'code' \ b並在mainform中我有一個線程繼續發送消息,但因爲showdialog而停止 - 而不是當我使用show()時它不會發生。 – 2011-03-29 20:26:40

回答

4

ShowDialog()是一個阻塞調用。線程實際運行時,它正忙於爲對話框抽取消息循環。這與程序主線上發生的情況沒有什麼不同。

這樣做是非常不明智的,對話框與您應用程序中其他窗口沒有Z順序關係。一個經典的不幸是,它可能會消失在另一個窗口的後面,但用戶找不到它的好方法。改用Control.BeginInvoke在UI線程上創建對話框。這也確保你的線程保持'運行'。

1

雖然乍一看似乎不相關,但您可以看看這question。你遇到的問題是form.showDialog()調用創建一個模態對話框,停止該線程上的代碼進度。如果旋轉另一個線程並在那裏觸發該呼叫,則在對話框顯示時,第一個線程將繼續運行。

0

使用System.Threading.Timer不是System.Windows.Form.Timer。

+0

模式消息泵正在渲染計時器的選擇有點不相關。 – 2011-03-29 20:11:53

+0

使用SWF計時器使用消息泵。但是,使用System.Threading Timer時,不使用泵,因此Model對話框不會阻止事件發生。 – 2011-03-29 20:14:45

+0

夠公平,經驗教訓。我習慣於所有計時器都基於WM_TIMER的世界。 – 2011-03-29 20:20:04

2

消息泵被您所顯示的模態對話框「盜取」。 你有2種選擇:

  1. 不要使用模態對話框(使用formShow())
  2. 使用一個新的線程做的工作,並使用UI主線程。