我正在研究使用上述任何一种处理长时间运行的方法。
我不会详细介绍使用这些方法可以实现的目标,但我想解释一下我想做什么。
我有一组与HTTP相关的方法,每个方法都会检索一些信息。这是长期运行服务中较大系统的所有部分(所以它不是一次性的,丢弃的代码)。
通常,哪种方法更好,封装和可维护性:使用Begin / End / AsyncCallback机制准备好处理返回的数据,或者通过使用派生的EventArgs类为每个事件触发来自任务内部的事件,如OnXXXReceived,OnXXXError?
我希望我足够清楚......我决定不提供代码示例,因为我对意见,建议和可能的陷阱更感兴趣,而不是特定实现的花絮。
谢谢!
答案 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的这一部分,了解有关如何组合这两种编程模型以实现异步天堂的更多信息。