WaitAll与WhenAll

| 异步CTP中的
Task.WaitAll()
Task.WhenAll()
有什么区别? 您能否提供一些示例代码来说明不同的用例?     
已邀请:
Task.WaitAll
阻塞当前线程,直到一切完成。
Task.WhenAll
返回一个任务,代表等待一切完成的动作。 这意味着从异步方法中,您可以使用:
await Task.WhenAll(tasks);
...这意味着您的方法将在所有步骤完成后继续,但是您不会在此之前一直挂起一个线程。     
尽管JonSkeet的答案以一种典型的出色方式为我解释了这种差异,但最大的实际差异是异常处理。编辑:同意-这不是最大的实际差异,而是差异。 当任何任务抛出时,2ѭ将抛出an6ѭ,您可以检查所有抛出的异常。
await Task.WhenAll
中的
await
解开
AggregateException
,并且“返回”只是第一个例外。 当下面的程序以“ 10”执行时,输出如下。
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();
    }
}
    
区别的一个例子-如果您有一个任务,则将UI线程执行某项操作(例如,代表情节提要中的动画的任务),如果您将其设置为``0'',则UI线程将被阻塞并且UI永远不会更新。如果使用
await Task.WhenAll()
,则不会阻塞UI线程,并且将更新UI。     
他们在做什么: 内部都做同样的事情。 有什么不同: WaitAll是一个阻止呼叫 WhenAll-不-代码将继续执行 在以下情况下使用: 没有结果就无法继续的WaitAll WhenAll什么时候才被通知,不会被阻止     

要回复问题请先登录注册