继续方法 - 如何准确理解它?



所以我在这里有这样的代码:

initialTask.ContinueWith((argument) => { ... });

我知道第二个任务在第一个任务完成后执行。 不过,我必须为第二个任务提供一个参数,这也是任务类型。

这个"参数"是旧任务还是一个全新的实例?

例如,当我想处理第二个任务中第一个任务的取消时,我必须调用:

initialTask.IsCanceled

论点。已取消

这个"参数"是旧任务还是一个全新的实例?

是的,它是对作为参数传递给.ContinueWith的相同 Task 实例参数的引用(即"旧"( - 您可以按以下方式验证这一点:

var initialTask = Task.Delay(1000);
initialTask.ContinueWith(t2 => {Debug.Assert(t2 == initialTask);}).Wait();

传入任务实例的原因是允许您访问任务的已完成状态和输出。但是,在访问t2的结果之前,您需要查看它是否抛出异常(t2.IsFaulted(,取消(t2.IsCanceled(等,这很快就会变得混乱。

相反,既然 C# 支持async / await语法,那么如果您按如下方式重写代码,您应该会发现代码更易于阅读,更易于处理异常等:

async Task MyMethod()
{
try
{
var initialResult = await SomeInitialTask();
var secondResult = await SecondTask(initialResult); // instead of .ContinueWith and accessing t2.Result
... etc.
}
catch (Exception ex)
{
// Much easier than checking .IsFaulted on each nested task
}
}  

argument是旧任务。它是为了方便和效率而提供的。没有它,lambda 将被迫关闭外部作用域中的变量initialTask,并且闭包具有内存开销。

相关内容

  • 没有找到相关文章

最新更新