北京手机网站,网络科技公司经营范围包括哪些,西安行业网站建设,杭州施必得展示设计有限公司Task.WhenAll、Task.WaitAll Task.WhenAll 和 Task.WaitAll 都是用于等待多个任务完成的方法#xff0c;但它们之间有一些重要的区别。
返回类型: Task.WhenAll: 返回一个 Task 对象#xff0c;该对象表示所有输入任务的联合任务。 Task.WaitAll: 没有返回值。它是一个同步方… Task.WhenAll、Task.WaitAll Task.WhenAll 和 Task.WaitAll 都是用于等待多个任务完成的方法但它们之间有一些重要的区别。
返回类型: Task.WhenAll: 返回一个 Task 对象该对象表示所有输入任务的联合任务。 Task.WaitAll: 没有返回值。它是一个同步方法会阻塞当前线程直到所有任务完成为止。
异步/同步:Task.WhenAll 是异步的不会阻塞当前线程Task.WaitAll 是同步的会阻塞调用线程直到所有任务完成
异常处理: Task.WhenAll 在任何一个任务出现异常时都会立即返回一个代表异常的 Task 对象而不会等待其他任务完成。你可以通过检查返回的 Task 对象来处理异常。 Task.WaitAll 会一直等待所有任务完成包括在其中一个任务出现异常时。异常将被捕获并包装在 AggregateException 中需要处理这个异常。 async及await await 关键字只能在被 async 代码块中使用。 await 关键字只能在返回类型为 Task、TaskT 、 ValueTaskT 的函数中使用或在无返回值函数中使用void。
await 关键字是异步的不会阻塞当前线程释放线程的控制权令线程异步执行但并不一定会启用新线程
示例
internal class TestClass
{public async void TestAwait(){await Task.Run(async () {await Task.Delay(1000);await Console.Out.WriteLineAsync(EXIT);});await Console.Out.WriteLineAsync(END);}public async void TestWaitAll(){ListTask list new();for (int i 0; i 10; i){list.Add(Task.Run(() {Console.WriteLine(Thread-{0}, Task.CurrentId);}));}Task.WaitAll(list.ToArray());await Console.Out.WriteLineAsync(END);}public async void TestWhenAll(){ListTask list new();for (int i 0; i 10; i){list.Add(Task.Run(() {Console.WriteLine(Thread-{0}, Task.CurrentId);}));}await Task.WhenAll(list.ToArray());await Console.Out.WriteLineAsync(END);}
}
测试
private static void Main(string[] args)
{TestClass testClass new();testClass.TestAwait();Thread.Sleep(10000);
}
private static void Main(string[] args)
{TestClass testClass new();testClass.TestWaitAll();Thread.Sleep(10000);
}
private static void Main(string[] args)
{TestClass testClass new();testClass.TestWhenAll();Thread.Sleep(10000);
}