通过Continuewith捕获多个Task回调

时间:2015-12-17 12:13:24

标签: c# .net task

我想在同一时间运行多个任务。每个任务都将返回一个值类型。

有人能告诉我如何通过main捕获所有回调吗?

我的测试代码:

(ObjectForModel) as (stringRepresentation for the UI) for (OneObjectFromList) in (ListOfObjects) | (Filter1) | (Filter2) ...

2 个答案:

答案 0 :(得分:2)

如果您尝试检索所有任务的结果,一旦完成任务,您只需使用Task.WhenAll即可。如果所有任务返回相同的结果,Task.WhenAll(Task[]重载将返回任务。在这种情况下,await Task.WhenAll将返回一个包含任务'按顺序结果:

var t1=Task.Run(()=>{...;return 1});
var t2=Task.Run(()=>{...;return 2});
var t3=Task.Run(()=>{...;return 3});

int[] results=await Task.WhenAll(t1,t2,t3);
//Check t1's result
Debug.Assert(results[0]==1);

当任务返回不同的结果时,将调用Task.WhenAll(params Task[]),它仅返回任务。您仍然可以使用其Result属性访问每项任务的结果,而不会有任何阻止风险:

var t1=Task.Run(()=>{...;return 1});
var t2=Task.Run(()=>{...;return "Hi"});
var t3=Task.Run(()=>{...;return new[]{1,2,3}});

await Task.WhenAll();

Debug.Assert(t2.Result=="Hi");

在使用ContinueWith时没有理由使用await,因为等待大致与使用ContinueWith相同 - 它不会&# 39; t启动任何异步执行,等待而不阻塞已经运行的任务完成,它提取结果并将同步上下文设置为等待启动之前的内容。

答案 1 :(得分:1)

如果你不想用不同的延续来调用任务,你需要为每个任务指定延续:

static async Task Test()
{
    Task t1 = StringAsync().ContinueWith(t => System.Console.Out.WriteLine("string"));
    Task t2 = IntAsync().ContinueWith(t => System.Console.Out.WriteLine("int"));
    Task t3 = ListAsync().ContinueWith(t => System.Console.Out.WriteLine("list"));
    await Task.WhenAny(t1, t2, t3); 
    // use WhenAll if you want to wait until all tasks are done
}
当任何子任务完成时,

WhenAny将完成,然后触发延续,因此只会调用一次延续。

如果要在完成所有任务后调用一次回调,最简单的方法是:

static async Task Test()
{
    Task t1 = StringAsync();
    Task t2 = IntAsync();
    Task t3 = ListAsync();
    await Task.WhenAll(t1, t2, t3); 
    // your continuation logic here
}