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

Pau*_*ner 7 c# asynchronous

考虑一下我对异步委托主题的看法.

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

Action action = DoSomething;
action.BeginInvoke(action.EndInvoke, null);
Run Code Online (Sandbox Code Playgroud)

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

电话EndInvoke适当吗?需要?

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

And*_*are 11

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

Task.Factory.StartNew(() => DoSomething());
Run Code Online (Sandbox Code Playgroud)

  • 如何处理Task对象?我对[这个问题]的意见感兴趣(http://stackoverflow.com/q/3734280/119738) (2认同)

Aar*_*ght 5

.NET 3.5中的"老派"方式是使用ThreadPool:

ThreadPool.QueueUserWorkItem(s => DoSomething());
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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