代码之家  ›  专栏  ›  技术社区  ›  Hai Minh Nguyen

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

  •  2
  • Hai Minh Nguyen  · 技术社区  · 14 年前

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

    不幸的是 异步机使用的技术 委托调用模式是 进一步开发技术结束 对于称为 远程处理。尽管微软仍然 支持使用异步 委托调用,它将 继续像今天这样运作 在可预见的未来 性能特点是 次优给定其他 方法——即线程、线程池, 和第三方物流。因此,开发商应该 倾向于其中一个 替代方案而不是实施 使用异步的新开发 委托调用API。进一步 包括对模式的讨论 在高级主题文本中 让开发人员 遇到它就会明白 作品。

    那么,除了第三方物流可能使用尚未结束的进一步开发技术之外,ADI是否有任何限制,而第三方物流没有这些限制?

    3 回复  |  直到 14 年前
        1
  •  3
  •   GregC Benjamin Baumann    13 年前

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

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

    任务允许取消。

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

        2
  •  2
  •   Henk Holterman    14 年前

    你要求“限制”。

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

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

    结论很简单,如果可以的话就用第三方物流。它既简单又有效。而且这只是进一步发展的开始。

        3
  •  2
  •   Sleeper Smith    13 年前

    不是说我是第三方物流专家。根据我的理解,TPL将并行级别上的决策抽象为配置/规范。

    例如,在并行For循环中。

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

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

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

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

    使用传统的异步方法调用来实现上述功能有点麻烦。

    TL,DR:TPL更有效,更容易使用。