2010-06-15 36 views
3

我正在研究使用上述任何一种处理长时间运行操作的方式。使用TPL和异步模式之间的实际区别

我不会详细介绍使用这些方法可以完成什么,但我更愿意解释我想要做什么。

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

一般情况下,哪种方法更好,封装和可维护性明智的:处理返回的数据时,它使用了开始的准备/结束/ AsyncCallback的机制,或通过从触发事件任务中,像OnXXXReceived,OnXXXError,使用派生的EventArgs类,每个事件?

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

谢谢!

回答

2

一般而言,TPL任务使用起来要容易得多。在你的情况下,使用Factory和LongRunning选项创建它们。

虽然我不太确定事件。为什么不在一个循环或类似的东西中处理Request/Rresponse?你已经在一个线程。

+0

主要是因为从封装的角度来看,这些操作不是那些知道应该如何处理数据的操作,一旦它们检索到它们。这是外部范围谁..但是,实际上,你可能是对的。我正在考虑将任务放入实现HTTP方法的类中,因此从外部代码我将订阅事件,然后调用内部启动任务的方法,该任务将检索信息并激发正确的事件。没有想到将任务放入外部范围,直接处理返回的数据。 – 2010-06-15 14:38:09

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类。

+0

好主意,谢谢。 – 2010-08-16 12:00:00

1

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

查看MSDN上.NET SDK的这一部分,标题为TPL and Traditional .NET Asynchronous Programming,以获取更多关于如何结合这两种编程模型以实现异步涅。的信息。

相关问题