Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TPL和异步模式的实际差异_C#_Asynchronous_.net 4.0_Task Parallel Library - Fatal编程技术网

C# 使用TPL和异步模式的实际差异

C# 使用TPL和异步模式的实际差异,c#,asynchronous,.net-4.0,task-parallel-library,C#,Asynchronous,.net 4.0,Task Parallel Library,我正在研究使用上述任何一种方法来处理长时间运行的操作 我不会详细说明使用这些方法可以实现什么,但我更愿意解释我想做什么 我有一组与HTTP相关的方法,每个方法都检索一些信息。这是一个长期运行的服务中更大的系统的一部分(所以它不是一些一次性代码) 一般来说,封装和可维护性方面,哪种方法更好:使用Begin/End/AsyncCallback机制在返回数据准备就绪时处理返回数据,或者使用派生的EventArgs类为每个事件从任务(如OnXXXReceived、OnXXXError)内触发事件 我希望

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

我不会详细说明使用这些方法可以实现什么,但我更愿意解释我想做什么

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

一般来说,封装和可维护性方面,哪种方法更好:使用Begin/End/AsyncCallback机制在返回数据准备就绪时处理返回数据,或者使用派生的EventArgs类为每个事件从任务(如OnXXXReceived、OnXXXError)内触发事件

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


谢谢

一般来说,第三方物流任务更易于使用。在您的情况下,使用Factory和LongRunning选项创建它们


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

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

    Task<StockDataCollection> loadFedHistoricalData =
        Task<StockDataCollection>.Factory.StartNew(
            () => LoadFedHistoricalData(),
            TaskCreationOptions.LongRunning);

    Task<StockDataCollection> normalizeHistoricalData =
        loadFedHistoricalData.ContinueWith(
            (t) => NormalizeData(t.Result));
任务加载FedHistoricalData=
Task.Factory.StartNew(
()=>LoadFedHistoricalData(),
TaskCreationOptions.LongRunning);
任务规范化历史数据=
loadFedHistoricalData.ContinueWith(
(t) =>归一化数据(t.Result));
在此代码中,loadFedHistoricalData任务运行loadFedHistoricalData,这是一个长期运行的I/O绑定任务。当返回时,它将继续执行另一个任务来规范化数据

获取TaskContinuationOptions参数,该参数可用于指定继续任务是始终运行还是仅在满足错误或取消等条件时运行


第5章A-Dash示例展示了这种事件处理的替代方法。您可以从下载代码。看看AnalysisEngine和MainWindowViewModel类。

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


查看MSDN上的.NET SDK中标题为“如何组合这两种编程模型以实现异步涅磐”的这一部分,了解更多信息。

主要是因为从封装的角度来看,这些操作不是那些一旦检索到数据就知道如何处理数据的人。是外部范围谁做的。。但是,事实上,你可能是对的。我在考虑将任务放入执行HTTP方法的类中,所以从外部代码我将订阅事件,然后调用在内部启动任务的方法,该任务检索信息,并触发正确的事件。没有考虑将任务放入外部范围,直接处理返回的数据。