继续任务和结果

本文关键字:结果 任务 继续 | 更新日期: 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();
        }