3

我正在研究使用上述任何一种方法来处理长期运行的操作。

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

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

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

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

谢谢!

4

3 回答 3

2

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

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

于 2010-06-15T14:30:48.093 回答
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 类。

于 2010-08-15T19:49:19.687 回答
1

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

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

于 2010-09-12T14:36:26.460 回答