【发布时间】:2017-01-20 08:17:39
【问题描述】:
我对 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 调用拉到原始任务中吗?它仍然会异步运行。一定有什么我不明白的地方。
【问题讨论】:
-
查看其他重载,特别是那些接受
TaskContinuationOptions的重载 -
如果你调用一个已经返回
Task<T>的方法,你会怎么做?您有一个人为的示例,其中原始部分实际上根本不是异步的,这一事实在这里没有帮助......将其想象为“我想调用一个 Web 服务,然后当它返回时我想调用第二个带有第一个结果的 Web 服务。”现在想想如何在不阻塞线程的情况下做到这一点。 -
@JonSkeet,如果可以的话,我会将您的评论标记为答案。我没有考虑过这种情况。
标签: c# task-parallel-library continuations