2010-04-13 49 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关键字)。