ContinueWith 方法 - 如何准确理解它?
ContinueWith Method - How to understand it exactly?
所以我有例如此代码在这里:
initialTask.ContinueWith((argument) => { ... });
我了解第一个任务完成后会执行第二个任务。
不过,我必须为第二个任务提供一个参数,该参数也是任务类型。
这是 'argument' 旧任务还是一个全新的实例?
例如当我想在第二个任务中处理第一个任务的取消时,我是否必须调用:
initialTask.IsCanceled
或
argument.IsCanceled
?
Is this 'argument' the OLD task or is this an entirely new instance?
是的,它是对作为参数传递给 .ContinueWith
(即 "Old")的同一个任务实例参数的引用 - 您可以按照以下方式验证这一点:
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
,并且闭包具有 .
所以我有例如此代码在这里:
initialTask.ContinueWith((argument) => { ... });
我了解第一个任务完成后会执行第二个任务。 不过,我必须为第二个任务提供一个参数,该参数也是任务类型。
这是 'argument' 旧任务还是一个全新的实例?
例如当我想在第二个任务中处理第一个任务的取消时,我是否必须调用:
initialTask.IsCanceled
或
argument.IsCanceled
?
Is this 'argument' the OLD task or is this an entirely new instance?
是的,它是对作为参数传递给 .ContinueWith
(即 "Old")的同一个任务实例参数的引用 - 您可以按照以下方式验证这一点:
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
,并且闭包具有