我对 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/