2008-09-17 24 views
15

事件在C#中是同步的。我有這個應用程序,我的主表單啓動一個線程,並在其中有一個循環來監聽一個流。當流中出現事件時,會從循環中將事件觸發到主窗體。在C#中使事件異步的最佳方式#

如果主窗體很慢或顯示一個消息框,或者環路將被暫停。最好的解決辦法是什麼?通過在主窗體上使用回調和調用?

回答

3

嗯,我使用了不同的場景,這取決於我當時需要什麼。

我相信BeginInvoke可能是最簡單的代碼,因爲你幾乎在那裏。無論哪種方式,你應該已經使用Invoke,所以只需更改爲BeginInvoke。在單獨的線程中使用回調將使用BeginInvoke完成相同的任務(只要您使用線程池來排隊回調)。

+0

這適合我的應用程序的最佳,扔在一個backgroundworker循環不完全符合我想要處理這個方式。 – 2008-09-17 09:59:48

8

由於您使用表單,因此更簡單的方法是使用BackgroundWorker組件。

BackgroundWorker的類可以 到一個單獨的, 專用線程運行的操作。耗時 像下載和數據庫 交易可能會導致您的用戶 界面(UI)看起來好像它 已停止響應,而他們是 運行。當您需要響應式UI 並且您面臨與此類操作相關的長時間延遲 時,BackgroundWorker類提供了一個便利的解決方案。

+0

我必須同意,BackgroundWorker是最好最乾淨的方法。 – 2008-09-17 07:18:14

0

如前所述,您有幾個選項,但根據我的經驗,最好不要使用代表和BeginInvoke,而使用BackgroundWorker(v2.0 +),因爲它更易於使用並且還允許您在線程完成時與主窗體進行交互。總而言之,我已經找到了一個非常實用的解決方案。

0

System.ComponentModel.BackgroundWorker確實是一個很好的起點。它會做你的異步工作,給你重要事件的通知,並有辦法更好地與你的表單集成。

例如,您可以通過註冊ProgressChanged事件的處理程序來激活進度通知。 (如果你有很長的異步過程,並且你不希望你的用戶認爲應用程序凍結,那麼強烈建議這樣做)

相關問題