【问题标题】:Are there new Task object created when we chain the ContinueWith calls?当我们链接 ContinueWith 调用时是否创建了新的 Task 对象?
【发布时间】:2018-02-19 21:14:48
【问题描述】:

考虑方法返回一系列任务的情况,例如这个(我主要使用 .net 3.5,所以示例使用 ContinueWith,但问题与 await 相同):

 static Task UnwrappedTask()
    {
        Task<Task> t = TestStr().ContinueWith( (
            return  GetTaskFromString(s).ContinueWith(
                // returns a task 
            });
        });
        return t.Unwrap();
    }

    static async Task GetTaskFromString(string str)
    {
        await Task.Delay(3000);
    }

    static async Task<string> TestStr()
    {
        await Task.Delay(3000);
        return "res";
    }

每次我们从ContinueWith() 返回时,是否都会创建一个新的Task 对象,或者编译器是否会以某种方式重用该实例?我对 Value 类型 Task.Result 在这种情况下的行为方式很感兴趣:它是一直被复制的,还是包装器 Task 类提供了一种将其传输到最外层方法的有效方式?

【问题讨论】:

    标签: c# async-await task compiler-optimization value-type


    【解决方案1】:

    ContinueWith总是创建一个新任务。它不可能做任何其他事情。该方法的整个设计是ContinueWith 采用现有的Task,在它完成后执行某个任意方法,并产生一个新结果。 ContinueWith 的结果永远不会与它继续执行的任务相同,因此它不能只是重复使用它。按照设计,它不会改变它添加延续的任务(至少在任何外部可见的方式中,技术上将延续存储到触发是任务的内部突变)。

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2020-12-24
      • 2018-06-09
      相关资源
      最近更新 更多