继续任务和结果
本文关键字:结果 任务 继续 | 更新日期: 2023-09-27 17:56:07
我使用此代码
public static void Main()
{
Task<int> t = new Task<int>(() => { return 43; });
t.Start();
t.ContinueWith((i) => {return i.Result * 2; });
Console.WriteLine("i = {0}", t.Result.ToString());
Console.Read();
}
我注意到 t.Result 等于 43 而不是 86。如果我在"继续"中打印某些内容,它将出现在控制台中。为什么"继续"没有修改结果?
那是因为ContinueWith
创建了全新的任务,您忽略了该任务的结果,而是打印第一个任务的结果,这是理所当然的43
。请尝试以下代码片段:
Task<int> t = new Task<int>(() => { return 43; });
t.Start();
var t2 = t.ContinueWith((i) => {return i.Result * 2; });
Console.WriteLine("i = {0}", t2.Result.ToString());
另外两个答案是正确的。还有另一个Task
通过ContinueWith
返回。如果你不关心每一个单独的步骤..然后,通过在链接ContinueWith
后分配的值,您的代码可以变得更小:
var t = Task.Run(() => 43)
.ContinueWith(i => i.Result * 2);
// t.Result = 86
您会发现许多基于任务的代码都遵循这一点。当您在末端链接ContinueWith
时,您通常不会创建和启动单个Task
实例。
当第一个任务完成执行时,ContinueWith 将创建一个新任务,该任务可能会也可能不会使用相同的线程,因为它取决于任务计划程序
您可以使用 ContinueWith<TResult>(Func<Task, TResult>
) 从第二个任务中获取结果
您的代码将如下所示
static void Main(string[] args)
{
Task<int> t = new Task<int>(() => { return 43; });
t.Start();
Task<int> t2 = t.ContinueWith<int>((i) => { return i.Result * 2; });
Console.WriteLine("i = {0}", t2.Result.ToString());
Console.Read();
}