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关键字)。