Yar*_*evi 308 c# asynchronous task-parallel-library async-await
是什么区别Task.WaitAll()
,并Task.WhenAll()
从异步CTP?您能提供一些示例代码来说明不同的用例吗?
Jon*_*eet 467
Task.WaitAll
阻止当前线程直到一切都完成.
Task.WhenAll
返回一个任务,表示等待一切都完成的动作.
这意味着从异步方法,您可以使用:
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
...这意味着你的方法将在一切都完成后继续,但是你不会把一个线程绑在那里直到那个时候.
tym*_*tam 46
虽然JonSkeet的回答以一种典型的优秀方式解释了差异,但最大的实际区别是异常处理.
Task.WaitAll
AggregateException
当任何任务抛出时,抛出一个并且您可以检查所有抛出的异常.将await
在await Task.WhenAll
解包AggregateException
和"返回"只有第一个例外.
当下面的程序执行时await Task.WhenAll(taskArray)
输出如下.
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.
Run Code Online (Sandbox Code Playgroud)
当执行以下程序时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.
Run Code Online (Sandbox Code Playgroud)
该程序:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 18
作为差异的一个例子 - 如果你有一个任务,它会对UI线程做一些事情(例如,一个代表故事板中动画的任务),如果你Task.WaitAll()
阻止了UI线程并且永远不会更新UI.如果您使用,await Task.WhenAll()
则不会阻止UI线程,并且将更新UI.
i10*_*100 15
他们在做什么:
有什么不同:
在以下情况下使用 which:
归档时间: |
|
查看次数: |
78224 次 |
最近记录: |