c#中使用Task.WhenAll

🚀简介

Task.WhenAll用于等待所有提供的Task对象完成执行。这个方法返回一个新的Task,这个Task将在所有提供的Task完成后完成。如果任何一个Task失败,Task.WhenAll返回的Task也将以异常状态完成。这个方法非常适合在你需要并行执行多个操作,并且需要等待所有操作完成后才能继续执行的情况。例如,你可能需要从多个源并行下载数据,然后在所有下载完成后处理这些数据。使用Task.WhenAll可以使你的代码更简洁,更易于理解和维护。你不需要手动跟踪每个Task的状态,也不需要编写复杂的代码来处理并行操作的结果。

🚀案例

如图我在文件夹中创建了三个记事本

👻然后我们创建三个异步任务t1、t2和t3,分别异步读取三个不同的文件。使用Task.WhenAll方法等待这三个任务全部完成。

cs 复制代码
class MyClass
{
    public static async Task Main(string[] args)
    {
        var t1 = File.ReadAllTextAsync(@"G:\txt\txt1.txt");
        var t2 = File.ReadAllTextAsync(@"G:\txt\txt2.txt");
        var t3 = File.ReadAllTextAsync(@"G:\txt\txt3.txt");
        string[] strings = await Task.WhenAll(t1, t2, t3);
        Console.WriteLine( strings[0]);
        Console.WriteLine( strings[1]);
        Console.WriteLine( strings[2]);
    }
}

在断点中也可以看出,await Task.WhenAll(t1, t2, t3)会等待t1、t2和t3都完成,然后继续执行后面的代码。

🚀Task.WaitAll和Task.WhenAll的区别

  1. 阻塞与非阻塞:WaitAll是一个阻塞方法,意味着它会阻塞当前的线程直到所有的任务都完成。而WhenAll是一个非阻塞方法,它会立即返回一个Task,这个Task在所有的任务都完成时完成。

  2. 异常处理:如果多个任务中有一个或多个抛出异常,WaitAll会抛出一个AggregateException,这个异常包含所有的异常。而WhenAll返回的Task在完成时如果有异常会抛出一个AggregateException

  3. 使用场景:WaitAll通常用于控制台应用程序或者需要阻塞当前线程等待所有任务完成的场景。WhenAll通常用于UI或ASP.NET应用程序,这些应用程序需要避免阻塞当前线程,并允许其他工作在等待所有任务完成时继续进行。

  4. 返回值:WaitAll没有返回值,而WhenAll返回一个Task,可以通过这个Task获取所有任务的结果。

🚀注意事项

  1. 避免在UI线程上使用Task.WaitAll,因为这会阻塞UI线程,导致应用程序无响应。如果你需要在UI线程上等待多个任务完成,应使用await Task.WhenAll。

  2. Task.WaitAll和Task.WhenAll都会抛出AggregateException,如果任何等待的任务抛出未处理的异常。你需要处理这个异常,或者确保所有任务都正确处理了它们的异常。

  3. Task.WhenAll返回一个任务,这个任务在所有给定的任务完成时完成。这意味着,如果你不等待或异步等待这个任务,你可能会在所有任务完成之前继续执行。如果你需要等待所有任务完成,你应该使用await关键字或者Result属性。

  4. Task.WaitAll和Task.WhenAll都不会取消等待的任务。如果你需要取消任务,你应该使用CancellationToken。

  5. 如果你使用Task.WhenAll,你应该注意,即使一个任务失败,其他任务仍然会继续执行。如果你需要在一个任务失败时取消所有任务,你需要使用CancellationTokenSource并在一个任务失败时调用Cancel方法。

  6. Task.WaitAll和Task.WhenAll都不会处理任务的结果。如果你需要处理任务的结果,你应该在任务完成后处理结果,或者使用Task.WhenAll返回的任务的Result属性。

相关推荐
IT技术分享社区4 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆11 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風12 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747415 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo16 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo18 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发18 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术18 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒19 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル21 小时前
C# EF 使用
c#