我有一个 Task<T> t1
.我想运行另一个 Task t2
在 t1
之后完成。我选择使用 .ContinueWith
t1
的方法.
void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobber => frobber.Frob())
}
除了,我不能这样做,因为
Task<T>
的 Action 参数通过 Task<T>
,而不是 T
本身。相反,我必须将传递给我的操作的参数的结果与它进行交互。void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobberTask => {
var frobber = frobberTask.Result;
frobber.frob();
});
}
如果 ContinueWith 的目的是在链中添加另一个 Action ,那么语言设计者为什么不简单地传递上一个任务的结果呢?或者,在非泛型任务的情况下期望无参数操作?
最佳答案
当任务进入 task.IsCompleted == true
时,ContinueWith 运行委托(delegate)状态。不是当它进入task.IsCompleted == true && task.IsFaulted == false && task.IsCanceled == false
状态,引发异常的任务或被取消的任务都“完成”但不会产生结果。
您可以在 TaskContinuationOptions
中传递重载喜欢 TaskContinuationOptions.OnlyOnRanToCompletion
获得您所描述的行为,但拥有 Action<T>
会更复杂仅用于单个枚举选项的重载,因此它们仅使用 Action<Task<T>>
的一般重载因此,如果您正在执行 OnlyOnRanToCompletion
,则可以使用相同的方法或者如果你正在做 OnlyOnFaulted
.
在 Task
中还有有用的信息。已完成任务的对象,如果您使用 AsyncState
如果已完成的任务未传递给 ContinueWith
,则传递元数据的属性除非您使用 lambda 表达式的变量捕获,否则您将无法获取该数据。
关于.net - 为什么ContinueWith传Task作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35927191/