获取上一个任务<>(续集)的结果?

6
我有这样的示例代码:
Task<int> t1= new Task<int>(()=>1);
t1.ContinueWith(r=>1+r.Result).ContinueWith(r=>1+r.Result);
t1.Start();

Console.Write(t1.Result); //1

它显然返回来自t1任务的Result(即1)。

但我如何从最后一个继续的任务中获取结果(它应该是3 {1+1+1})?

1个回答

5

ContinueWith 方法本身返回一个任务 - 在这种情况下是 Task<int>。你可以像处理“原始”任务一样对这个任务进行任何操作,包括等待它完成并检查结果。(注意:你不能手动Start一个继续执行的任务)。

var t1 = new Task<int>( () => 1);
var t2 = t1.ContinueWith(r => 1 + r.Result)
           .ContinueWith(r => 1 + r.Result);

t1.Start();

Console.Write(t1.Result); //1
Console.Write(t2.Result); //3

为什么在哪里编写 continueWith 很重要? - Royi Namir
不确定您的意思。您能否澄清一下?在这种情况下,TPL 的“一致性”是指任务的连续也是一项任务。 - Ani
我知道continuewith返回一个任务。问题:我认为这很简单:t1仅引用第一个任务。稍后,该任务将与其他任务一起添加,但我无法从外部访问它们。但是在您的答案中,t2确实指的是最后一个继续的任务,因此您可以获取该值。这正确吗? - Royi Namir
你想要查询一个任务的所有后续任务,然后递归地查询它们的后续任务,以此类推,直到找到“最后”的后续任务? - Ani
不,我认为你已经回答了我的问题。我认为这只是一个引用问题。我的引用只指向原始任务,而你的引用则指向最后继续的任务。就是这样。(请确认)。另外,有没有一种属性可以告诉我一个任务的连续任务?感谢您的帮助 :-) - Royi Namir
没错,t2 引用了最后一个 continuation。回答你的第二个问题,一个 Task 没有公共属性可以获取它的 continuations(这样做实际上违背了 TPL 的精神,我认为)。但是理论上你可以使用一些反射技巧来达到目的。不过我并不推荐这么做。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接