ContinueWith方法-如何准确理解它?

问题描述 投票:1回答:1

所以我有此代码在这里:

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

我了解第二个任务在第一个任务完成后便会执行。我必须为第二个Task提供一个参数,它也是Type Task的参数。

此“参数”是OLD任务还是这是一个全新的实例?

例如当我想在第二个任务中处理第一个任务的取消时,是否必须致电:

initialTask​​.IsCanceled

argument.IsCanceled

c# task-parallel-library continuewith
1个回答
0
投票

此“参数”是OLD任务还是这是一个全新的实例?

与作为参数传递给.ContinueWith的相同Task实例参数(即“旧”)-您可以按照以下说明进行验证:

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

传递任务实例的原因是允许您访问Task的完成状态和输出。但是,在访问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
   }
}  
© www.soinside.com 2019 - 2024. All rights reserved.