2012-12-05 85 views
0

我有2個線程。線程1,具有UserControl和具有委託方法的線程2。在線程2,Control.Invoke()後無法獲得回調()

我)我需要調用線程1上的委託。

二)根據如有異常發生與否,執行一些額外的邏輯

這是我在做什麼。在線程1,控制創作之前,我已經註冊了一個回調

Application.ThreadException += MyUIExceptionHandler(); 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

問題1:現在 ,在線程2,當我打電話thread1Control.BeginInvoke(myDelegateMethod, args)我得到回調MyUIExceptionHandler()上的發生一個例外,但由於Control.BeginInvoke是異步的,我不知道在執行上述步驟ii)之前需要等待多少時間。撥打BeginInvoke()後,簡單的Thread.Sleep(5000)爲我完成了這項工作,應該以我知道的方式完成。但是,爲了達到這個目標,我還有什麼其他選擇? PS:我無法做任何來自UserControl的通知,因爲我無法控制該代碼!

問題2: 如果我使用thread1Control.Invoke(myDelegateMethod, args)這是一個同步調用似乎完美地適應該法案,但是當有一個例外,我不明白回調MyUIExceptionHandler()。爲什麼我不會在這種情況下得到回撥?

回答

1

Control.BeginInvoke()是一個即忘即用的方法。由於你的線程已經在其他地方移動,甚至可能不再運行,所以在UI線程上引發目標引發的任何異常。

Control.Invoke()是一個開火等待完成的方法。您的工作線程被阻塞,直到目標完成執行。由於只有在對結果感興趣時才使用該方法,因此目標引發的異常在您的工作線程上重新生成。如果你想保持程序運行,你必須抓住它。

+0

Invoke()不會給我異常回調。 BeginIvoke()會。現在,我正在使用BeginInvoke()並使用線程同步。所以,這解決了我的問題,也回答了問題1,但問題2仍然沒有答案。 –

+0

從答案中應該清楚爲什麼會這樣。該線程會重新產生異常。你需要用try/catch來包裝你的Invoke()調用。 –