【发布时间】:2016-06-25 22:18:02
【问题描述】:
我有一个Task<T> t1。我想在t1 完成后运行另一个Task t2。我选择使用t1的.ContinueWith方法。
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 的目的是向链中添加另一个动作,为什么语言设计者不简单地传递上一个任务的结果?或者,在非泛型任务的情况下,需要一个无参数的操作?
【问题讨论】:
-
如果任务抛出异常,前一个任务的结果是什么?
-
考虑到非并行开发或 Promises,我希望有一个不同的方法签名来处理异常。 ContinueWith 向我暗示上一个任务已经完成,没有出错。
-
顺便说一句,我认为使用
ContinueWith(async t=> { var result = await t ... })而不是.Result是一种更好的做法,即使有人将操作复制粘贴到.Result可能会阻止线程。
标签: .net task-parallel-library design-decisions