Fire和忘记异步委托的正确方法

考虑到我对异步委托的主题生锈了。

如果我想以异步方式异步调用方法,这是一种合适的方法吗?

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

DoSomething()方法捕获所有exception并在内部处理它们。

EndInvoke的调用是否合适? 需要?

是否有更清晰的方法来实现相同的行为?

.NET 3.5中的“老派”方式是使用ThreadPool

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

如果您更喜欢使用异步委托,那么即使您没有要在回调上执行的任何其他代码,您也应该知道对EndInvoke的调用必要的。

新方法(在.NET 4中)是这样做的:

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

应该注意的是Task.Factory.StartNew(() => DoSomething()); 没有观察到DoSomething方法抛出的任何潜在exception。 我知道这是开始即发即弃操作时所需要的,但就.Net 4而言,垃圾收集器最终确定的任何未观察exception的任务都会升级为未处理的exception,会导致您的进程终止。 但是,在.Net 4.5中,默认行为已更改(请参阅async和await关键字)。