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

时间:2010-04-13 14:48:21

标签: c# asynchronous

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

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

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

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

EndInvoke的呼叫是否合适?需要?

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:5)

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