【问题标题】:Asynchronous Delegate Invocation (ADI) vs. Task Parallel Library (TPL)异步委托调用 (ADI) 与任务并行库 (TPL)
【发布时间】:2010-09-18 06:16:41
【问题描述】:

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

不幸的是,底层 异步使用的技术 委托调用模式是一种 进一步开发结束技术 用于分布式编程,称为 远程处理。虽然微软仍然 支持使用异步 委托调用,它将 继续像今天一样运作 在可预见的未来, 性能特点是 给定其他次优 方法——即 Thread、ThreadPool、 和 TPL。因此,开发商应 倾向于支持其中之一 替代方案而不是实施 使用异步的新开发 委托调用 API。更远 包括对模式的讨论 在高级主题文本中 遵循,以便开发人员 遇到它就会明白它是怎么回事 有效。

除了 TPL 可能使用尚未结束的进一步开发技术之外,ADI 有哪些限制而 TPL 没有?

【问题讨论】:

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


    【解决方案1】:

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

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

    任务允许取消。

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

    【讨论】:

    • UI 的后台处理是异步委托试图解决的常见问题。多核并行计算是Tasks试图解决的问题。
    【解决方案2】:

    您要求“限制”。

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

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

    结论很简单,如果可以,请使用 TPL。它既简单又高效。它正处于进一步发展的开端。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 2017-06-23
        • 2014-03-19
        • 2015-09-09
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多