繁体   English   中英

异步委托调用(ADI)与任务并行库(TPL)

[英]Asynchronous Delegate Invocation (ADI) vs. Task Parallel Library (TPL)

在阅读Essential C#4.0时,我在ADI上得到了以下评论:

不幸的是,异步委托调用模式使用的基础技术是用于分布式编程的远程开发技术,称为远程处理。 尽管Microsoft仍支持使用异步委托调用,并且在可预见的将来它将继续像今天一样运行,但是在其他方法(即Thread,ThreadPool和TPL)下,性能特征不是最佳的。 因此,开发人员应该倾向于使用这些替代方法之一,而不是使用异步委托调用API进行新开发。 随后的高级主题文本中包含对该模式的进一步讨论,以便遇到该模式的开发人员可以了解其工作方式。

那么,除了TPL可能会使用尚未开发的最终技术之外,ADI还有TPL没有的任何限制吗?

任务和异步委托都使用线程池。

在可以将异常传播到调用方的意义上,任务和异步委托是相似的。 任务更进一步,累积所有抛出的异常,并将它们呈现给所有线程池工作人员。

任务允许取消。

有一个免费的章节详细介绍了所有这些内容: http : //www.albahari.com/threading/

您要求“限制”。

我认为您不会发现ADI(也称为APM)无法完成的任何工作。 关键是性能和程序员的努力。

判决似乎是一致的, 乔·达菲Joe Duffy)还警告您远离 ADI / APM

结论很容易,如果可以的话,请使用TPL。 它既简单又有效。 而且这只是进一步发展的起点。

并不是说我是TPL的专家。 据我了解,TPL将并行性级别上的决策抽象为配置/规范。

例如,在并行for循环中。

Parallel.For(0,1000,a => Thread.Sleep(10000));

您不一定会产生1000个线程。 TPL将“并行化”到适当数量的线程。 与异步调用方法1000次相反。 (这也不会创建1000个线程,但是直到释放所需的资源之前,您只会阻塞执行调用。

此外,TPL允许您对并行任务进行更高级别的控制。 在上面的示例中,您可以轻松地暂停/中断/中止for循环。 如。

Parrallel.For(0,1000,(a,loopState)=> loopState.Break());

使用常规的异步方法调用来实现上述目的有点麻烦。

TL,DR:TPL更加高效且易于使用。

暂无
暂无

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

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