繁体   English   中英

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

[英]The correct way to Fire-and-Forget an asynchronous delegate

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM