Task.WaitAll()
和Task.WhenAll()
这两个方法有什么区别?它们是Async CTP中的异步操作。您能提供一些示例代码来说明它们的不同用法吗?
Task.WaitAll()
和Task.WhenAll()
这两个方法有什么区别?它们是Async CTP中的异步操作。您能提供一些示例代码来说明它们的不同用法吗?
Task.WaitAll
阻塞当前线程直至所有任务完成。
Task.WhenAll
返回一个表征等待所有任务完成的任务。
也就是说,在异步方法中,你可以使用:
await Task.WhenAll(tasks);
这意味着您的方法将在所有任务完成后继续执行,但您不需要绑定一个线程一直等到那个时候。
19/11/2016 12:18:37 AM: Task 1 started
19/11/2016 12:18:37 AM: Task 3 started
19/11/2016 12:18:37 AM: Task 2 started
Caught Exception in Main at 19/11/2016 12:18:40 AM: Task 1 throwing at 19/11/2016 12:18:38 AM
Done.
Task.WaitAll(taskArray)
执行下面的程序时,输出结果如下。19/11/2016 12:19:29 AM: Task 1 started
19/11/2016 12:19:29 AM: Task 2 started
19/11/2016 12:19:29 AM: Task 3 started
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 1 throwing at 19/11/2016 12:19:30 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 2 throwing at 19/11/2016 12:19:31 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 3 throwing at 19/11/2016 12:19:32 AM
Done.
class MyAmazingProgram
{
public class CustomException : Exception
{
public CustomException(String message) : base(message)
{ }
}
static void WaitAndThrow(int id, int waitInMs)
{
Console.WriteLine($"{DateTime.UtcNow}: Task {id} started");
Thread.Sleep(waitInMs);
throw new CustomException($"Task {id} throwing at {DateTime.UtcNow}");
}
static void Main(string[] args)
{
Task.Run(async () =>
{
await MyAmazingMethodAsync();
}).Wait();
}
static async Task MyAmazingMethodAsync()
{
try
{
Task[] taskArray = { Task.Factory.StartNew(() => WaitAndThrow(1, 1000)),
Task.Factory.StartNew(() => WaitAndThrow(2, 2000)),
Task.Factory.StartNew(() => WaitAndThrow(3, 3000)) };
Task.WaitAll(taskArray);
//await Task.WhenAll(taskArray);
Console.WriteLine("This isn't going to happen");
}
catch (AggregateException ex)
{
foreach (var inner in ex.InnerExceptions)
{
Console.WriteLine($"Caught AggregateException in Main at {DateTime.UtcNow}: " + inner.Message);
}
}
catch (Exception ex)
{
Console.WriteLine($"Caught Exception in Main at {DateTime.UtcNow}: " + ex.Message);
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
await t1; await t2; await t3;
与await Task.WhenAll(t1,t2,t3);
之间的比较。 - frostshoxxawait
的产物,而不是这两种方法之间的差异。无论是直接抛出还是通过属性(Task.Exception
属性)传递,两种方法都会传播 AggregateException
。 - Theodor Zoulias举个例子来说明区别--
如果你有一个处理UI线程的任务(例如代表Storyboard中的动画的任务),如果你使用Task.WaitAll()
,那么UI线程就会被阻塞,UI也不会被更新。
如果你使用await Task.WhenAll()
,那么UI线程不会被阻塞,UI将会被更新。
他们都做什么:
有什么区别:
何时使用哪个:
WaitAll
就没有这种可能性。 - JeppeTask.WaitAll
吗?我的意思是,不要在启动任务后立即调用它。 - P-L
WhenAll
返回的任务,但这与阻塞线程不同。 - Jon Skeet