c# - TPL ContinueWith 方法的用途是什么?

标签 c# task-parallel-library continuations

我对 TPL ContinueWith 方法感到困惑。我不明白为什么需要它。 Here's an example from MSDN显示如何使用 ContinueWith:

static void SimpleContinuationWithState()
{
   int[] nums = { 19, 17, 21, 4, 13, 8, 12, 7, 3, 5 };
   var f0 = new Task<double>(() => nums.Average());
   var f1 = f0.ContinueWith(t => GetStandardDeviation(nums, t.Result));

   f0.Start();
   Console.WriteLine("the standard deviation is {0}", f1.Result);
}

看来我可以删除 ContinueWith 调用而不改变结果:

static void SimpleContinuationWithState()
{
   int[] nums = { 19, 17, 21, 4, 13, 8, 12, 7, 3, 5 };
   var f0 = new Task<double>(() => GetStandardDeviation(nums, nums.Average()));

   f0.Start();
   Console.WriteLine("the standard deviation is {0}", f0.Result);
}

这个标准差示例一定是一个人为的示例,但我想不出使用ContinueWith的理由。 (除非某个库调用而不是我创建了任务)在每种情况下,我都不能将ContinueWith 调用拉入原始任务吗?它仍然会异步运行。一定有什么我不明白的地方。

最佳答案

您假设每个 Task 只是一个在线程池线程中运行的同步方法。事实并非如此,您不应该这样考虑任务。 Task 是某种将在某个时刻完成的工作,可能会生成一个值作为结果。它可能正在线程池线程中运行一个方法,它可能正在等待事件触发,它可能正在等待对网络请求的响应,或者等待硬盘驱动器完成将一些数据写入文件。

是的,如果您的任务专门是在线程池线程中运行的一些同步代码,并且您总是希望在该任务之后立即运行更多同步代码相同的线程池线程,并且您是创建该 Task 的人,并且没有其他需要代表该中间​​结果的 Task,那么您只需更改方法即可用于生成 Task 如您所示(如果您处于这种情况,您最好这样做)。不过,这最终只是一个相当狭窄的案例。

关于c# - TPL ContinueWith 方法的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39458010/

相关文章:

c# - Xaml 中的 Android native View 不显示在 Xamarin.Forms 中

c# - WPF Datagrid 不显示文本

c# - 如何使用 FakeItEasy 伪造 Action <>

haskell - 构造延续类型?

haskell - 什么是基于 Haskell 延续的 Web 框架?

eclipse - Scala 2.8.1 和 Eclipse 中的延续

c# - 在 WPF 工具箱中找不到我的 winforms 控件

c# - SynchronizationContext.Current 在主 UI 线程的 Continuation 中为 null

c# - 新线程和新任务之间的区别?

exception-handling - Async.Await未捕获任务异常