【问题标题】:Practical differences between using TPL and Async Pattern使用 TPL 和异步模式之间的实际区别
【发布时间】:2010-06-15 14:22:51
【问题描述】:

我正在考虑使用上述任何一种方法来处理长时间运行的操作。

我不会详细说明使用这些方法可以完成什么,但我宁愿解释我想要做什么。

我有一组与 HTTP 相关的方法,每个方法都检索几条信息。这都是长期运行服务中更大系统的一部分(所以它不是一些一次性的、丢弃的代码)。

通常,哪种方法更好,封装性和可维护性更好:使用 Begin/End/AsyncCallback 机制处理返回的数据,或者通过从任务中触发事件,如 OnXXXReceived、OnXXXError,为每个事件使用派生的 EventArgs 类?

我希望我说的足够清楚。我决定不提供代码示例,因为我更感兴趣的是意见、建议和可能的陷阱,而不是具体实现的花絮。

谢谢!

【问题讨论】:

    标签: c# asynchronous .net-4.0 task-parallel-library


    【解决方案1】:

    一般来说,TPL 任务更容易使用。在您的情况下,使用 Factory 和 LongRunning 选项创建它们。

    不过,我不太确定这些事件。为什么不在循环或类似的方式中处理请求/响应?你已经在一个线程上。

    【讨论】:

    • 主要是因为从封装的角度来看,这些操作并不是那些知道一旦检索到数据后应该如何处理数据的操作。这是外部作用域。但是,实际上,您可能是对的。我正在考虑将 Tasks 放入执行 HTTP 方法的类中,因此我将从外部代码订阅事件,然后调用内部启动任务的方法,该任务检索信息并触发正确的事件。没想到把任务放到外部作用域,直接处理返回的数据。
    【解决方案2】:

    您还可以在获取任务完成后使用 ContinuationTasks 处理数据。

        Task<StockDataCollection> loadFedHistoricalData =
            Task<StockDataCollection>.Factory.StartNew(
                () => LoadFedHistoricalData(),
                TaskCreationOptions.LongRunning);
    
        Task<StockDataCollection> normalizeHistoricalData =
            loadFedHistoricalData.ContinueWith(
                (t) => NormalizeData(t.Result));
    

    在此代码中,loadFedHistoricalData 任务运行 LoadFedHistoricalData,这是一个长时间运行的 I/O 绑定任务。当它返回时,它会继续执行另一个标准化数据的任务。

    ContinueWith 采用 TaskContinuationOptions 参数,可用于指定继续任务是始终运行还是仅在满足某些条件(如错误或取消)时运行。

    第 5 章 A-Dash 示例展示了这种替代事件的方法。您可以从http://parallelpatterns.codeplex.com/ 下载代码。查看 AnalysisEngine 和 MainWindowViewModel 类。

    【讨论】:

      【解决方案3】:

      在 I/O 性能方面,您根本无法击败异步编程模型 (APM)。任何时候你都可以使用它,你应该是。幸运的是,Task Parallel Library (TPL) 自带支持,通过the FromAsync factory method 将 APM 工作与“纯”TPL 任务结合起来。

      查看 MSDN 上名为 TPL and Traditional .NET Asynchronous Programming 的 .NET SDK 部分,了解有关如何结合这两种编程模型以实现异步必杀技的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多