当前位置: 首页 > news >正文

同步与异步:.NET 中的 Task.WaitAll 和 Task.WhenAll

在 C# 中,异步编程通常涉及同时运行多个任务。处理多个任务的两种常见方法是 Task.WaitAll 和 Task.WhenAll。虽然它们看起来很相似,但它们的用途不同,并且用于不同的场景。本文探讨了 Task.WaitAll 和 Task.WhenAll 之间的区别,并通过实际示例来说明它们的用法。

什么是 Task.WaitAll?

Task.WaitAll 是一种同步方法,它会阻塞调用线程,直到所有提供的任务都已完成。当您需要确保一组任务在继续之前已完成时,该方法很有用,但它以阻塞方式执行,这意味着调用 Task.WaitAll 的线程会被占用,直到所有任务都完成为止。

Task.WaitAll 的示例用法

using System;
using System.Threading.Tasks;
class Program
{static void Main(){Task task1 = Task.Run(() => PerformTask(1));Task task2 = Task.Run(() => PerformTask(2));Task task3 = Task.Run(() => PerformTask(3));Task.WaitAll(task1, task2, task3); // Blocks until all tasks completeConsole.WriteLine("All tasks completed.");}static void PerformTask(int taskId){Console.WriteLine($"Task {taskId} starting.");Task.Delay(1000).Wait(); // Simulate workConsole.WriteLine($"Task {taskId} completed.");}
}

在此示例中,Task.WaitAll 阻止主线程,直到所有三个任务都完成。

什么是 Task.WhenAll?

Task.WhenAll 是一种异步方法,当所有提供的任务都完成后,该方法将返回单个任务。与 Task.WaitAll 不同,它不会阻止调用线程。相反,它允许调用代码继续异步执行。

Task.WhenAll 的示例用法

using System;
using System.Threading.Tasks;
class Program
{static async Task Main(){Task task1 = Task.Run(() => PerformTask(1));Task task2 = Task.Run(() => PerformTask(2));Task task3 = Task.Run(() => PerformTask(3));await Task.WhenAll(task1, task2, task3); // Waits for all tasks to complete asynchronouslyConsole.WriteLine("All tasks completed.");}static void PerformTask(int taskId){Console.WriteLine($"Task {taskId} starting.");Task.Delay(1000).Wait(); // Simulate workConsole.WriteLine($"Task {taskId} completed.");}
}

在此示例中,Task.WhenAll 允许主方法等待所有任务的完成,而不会阻塞调用线程。

主要区别

阻塞与非阻塞

  1. 阻塞与非阻塞
  • Task.WaitAll:阻止调用线程,直到所有任务完成。
  • Task.WhenAll:返回一个可以等待的任务,允许调用线程继续异步执行。
  1. 返回类型
  • Task.WaitAll:没有返回值。
  • Task.WhenAll:返回代表所有提供的任务完成的 Task。
  1. 应用场景
  • Task.WaitAll:当您需要阻止直到任务完成时使用,通常在非 UI 或控制台应用程序中。
  • Task.WhenAll:用于异步编程,尤其是在不希望阻塞主线程的 UI 应用程序中。

实际用例

  1. 何时使用 Task.WaitAll
  • 在控制台应用程序中,您需要确保某些任务在继续之前已经完成。
  • 当您处理不支持异步/等待模式的遗留代码时。
  1. 何时使用 Task.WhenAll
  • 在 UI 应用程序中保持界面响应。
  • 在 Web 应用程序中处理多个异步操作而不阻塞主线程。

结论

Task.WaitAll 和 Task.WhenAll 是 C# 中处理多个任务的必备工具。当您需要阻止调用线程直到任务完成时,请使用 Task.WaitAll;当需要异步等待时,请使用 Task.WhenAll。了解它们的区别和适当的用例可以帮助您编写更高效、响应更快的应用程序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringMVC框架--个人笔记步骤总结
  • 04.为什么line-height是无单位的 兄弟元素淡出效果 蚀刻文字效果
  • uniapp vue3微信小程序如何获取dom元素
  • 什么? CSS 将支持 if() 函数了?
  • JavaScript中的面向对象编程
  • 数据高效交互丨DolphinDB Redis 插件使用指南
  • 数据结构(Java):树二叉树
  • 前端数据加密方式
  • 《Windows API每日一练》9.13资源-鼠标位图和字符串
  • 基于Java+SpringMvc+Vue技术的药品进销存仓库管理系统设计与实现系统(源码+LW+部署讲解)
  • 什么叫图像的中值滤波,并附利用OpenCV和MATLB实现均值滤波的代码
  • Go 初始化一个字典
  • Android人脸解锁源码解析
  • el-table 动态添加删除 -- 鼠标移入移出显隐删除图标
  • 2024前端面试题之Vue3
  • Android单元测试 - 几个重要问题
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • httpie使用详解
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java方法详解
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Median of Two Sorted Arrays
  • Web设计流程优化:网页效果图设计新思路
  • 复习Javascript专题(四):js中的深浅拷贝
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 普通函数和构造函数的区别
  • 入手阿里云新服务器的部署NODE
  • 移动端解决方案学习记录
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​520就是要宠粉,你的心头书我买单
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ## 基础知识
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define与typedef区别
  • #pragma once
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C++)八皇后问题
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Java)【深基9.例1】选举学生会
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (solr系列:一)使用tomcat部署solr服务
  • (纯JS)图片裁剪
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (自用)仿写程序
  • *2 echo、printf、mkdir命令的应用
  • .cn根服务器被攻击之后
  • .CSS-hover 的解释
  • .env.development、.env.production、.env.staging
  • .gitignore文件—git忽略文件
  • .Net Core 笔试1
  • .Net IOC框架入门之一 Unity