我在阅读Essential C#4.0时得到了关于ADI的评论:
不幸的是,潜在的 异步使用的技术 委托调用模式是一个 进一步发展技术 用于分布式编程 远程处理。虽然微软仍在 支持异步的使用 委托调用,它会 继续像今天一样运作 在可预见的未来, 性能特征是 给予其他的次优 方法 - 即Thread,ThreadPool, 和TPL。因此,开发人员应该 倾向于支持其中一个 替代而非实施 使用异步的新开发 委托调用API。进一步 包括对模式的讨论 在高级主题文本中 以下是开发人员 遇到它会明白它是怎么回事 的工作原理。
ADI有没有任何限制,TPL没有,除了TPL可能还使用了一种非进一步发展的技术?
答案 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更高效,更易于使用。