我想在同一时间运行多个任务。每个任务都将返回一个值类型。
有人能告诉我如何通过main
捕获所有回调吗?
我的测试代码:
(ObjectForModel) as (stringRepresentation for the UI) for (OneObjectFromList) in (ListOfObjects) | (Filter1) | (Filter2) ...
答案 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
}