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

时间:2010-09-18 06:16:41

标签: c# .net multithreading .net-4.0

我在阅读Essential C#4.0时得到了关于ADI的评论:

  

不幸的是,潜在的   异步使用的技术   委托调用模式是一个   进一步发展技术   用于分布式编程   远程处理。虽然微软仍在   支持异步的使用   委托调用,它会   继续像今天一样运作   在可预见的未来,   性能特征是   给予其他的次优   方法 - 即Thread,ThreadPool,   和TPL。因此,开发人员应该   倾向于支持其中一个   替代而非实施   使用异步的新开发   委托调用API。进一步   包括对模式的讨论   在高级主题文本中   以下是开发人员   遇到它会明白它是怎么回事   的工作原理。

ADI有没有任何限制,TPL没有,除了TPL可能还使用了一种非进一步发展的技术?

3 个答案:

答案 0 :(得分:3)

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

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

任务允许取消。

有一个免费的章节更详细地描述了所有这些: http://www.albahari.com/threading/

答案 1 :(得分:2)

你要求“限制”。

我认为你不会发现任何ADI(也称为APM)无法做到的事情。关键是性能和程序员的努力。

判决似乎是一致的,来自ADI / APM的Joe Duffy also warns you away

结论很简单,如果可以,请使用TPL。它简单而有效。它正处于刚刚开始的进一步发展阶段。

答案 2 :(得分:2)

不是说我是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更高效,更易于使用。