2010-04-13 31 views
5

考慮我生鏽的異步委託的主題。Fire-and-Forget異步委託的正確方法

如果我想以異常方式異步調用方法,這是一種適合的方式嗎?

Action action = DoSomething; 
action.BeginInvoke(action.EndInvoke, null); 

DoSomething()方法捕獲所有異常並在內部處理它們。

撥打電話EndInvoke是否合適?需要?

有沒有更清晰的方法來實現相同的行爲?

回答

4

在.NET 3.5的 「老派」 的方式是使用ThreadPool

ThreadPool.QueueUserWorkItem(s => DoSomething()); 

如果您更喜歡使用異步委託,那麼即使您沒有任何您希望在回調中執行的其他代碼,您也應該知道對EndInvoke的呼叫是必需的,即

+1

你的一條線擊敗了我的兩條線。 – 2010-04-13 15:56:35

9

的新方法(在.NET 4)要做到這一點:

Task.Factory.StartNew(() => DoSomething()); 
+2

處理Task對象怎麼樣?我會對你對[這個問題]的看法感興趣(http://stackoverflow.com/q/3734280/119738) – 2010-09-17 09:54:05

5

應當指出的是, Task.Factory.StartNew(() => DoSomething()); 未能遵守由DoSomething的方法拋出的任何潛在的異常。我知道這就是開始一個即開即用操作時所要做的,但就.NET 4而言,垃圾回收器定義了一個未被觀察到的異常的任何任務將會升級爲一個未處理的異常,從而會終止您的進程。但是,在.Net 4.5中,默認行爲已更改(請參閱async & await關鍵字)。