使用TPL和异步模式之间的实际差异

时间:2010-06-15 14:22:52

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

我正在研究使用上述任何一种处理长时间运行的方法。

我不会详细介绍使用这些方法可以实现的目标,但我想解释一下我想做什么。

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

但是,我对这些事件不太确定。为什么不在循环或类似的东西中处理Request / Rresponse?你已经在线程了。

答案 1 :(得分:1)

一旦提取任务完成,您也可以使用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类。

答案 2 :(得分:1)

在I / O性能方面,您无法击败异步编程模型(APM)。任何时候你都可以使用它,你应该。幸运的是,任务并行库(TPL)提供了支持,通过the FromAsync factory method将APM工作与“纯”TPL任务相结合。

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