C#—Task异步的常用方法及TaskFactory工厂类详解

Task异步的常用方法

C# 中的 Task 类是 System.Threading.Tasks 命名空间的一部分,用于表示异步操作。

以下是一些常用的 Task 类方法:

一、Task.Run(Action action):

此静态方法用于在后台运行一个新任务,并返回与该任务关联的 Task 实例。这对于在不阻塞当前线程的情况下启动后台操作非常有用。

Task.Run(() =>
{// 代码
});

二、Task.Delay(int millisecondsDelay):

此静态方法创建一个在指定延迟之后完成的 Task。这对于定时操作或模拟长时间运行的任务非常有用。

await Task.Delay(1000); // 等待1秒


三、Task.WhenAll(Task[] tasks):

此静态方法接收一系列任务,并返回一个新的 Task,当所有输入任务完成时,该任务才会完成。这对于同时等待多个任务完成非常有用。  WhenAll() 是一个静态方法

注意:由于此调用不会默认等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });await Task.WhenAll(task1, task2);

四、Task.WhenAny(Task[] tasks):

此静态方法接收一系列任务,并返回一个新的 Task<Task>,当其中任何一个输入任务完成时,该任务就会完成。这对于等待多个任务中的任意一个完成非常有用。 WhenAny() 是一个静态方法

注意:由于此调用不会默认等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });var completedTask = await Task.WhenAny(task1, task2);

五、Task.Wait():

此方法使当前线程等待任务完成。这将阻塞当前线程,直到任务完成。通常,建议使用 await 关键字而不是 Wait(),因为它可以更好地处理异步上下文和错误处理。   

var task = Task.Run(() => { /* 代码 */ });
task.Wait();
六、Task.WaitAll(Params Task[])

等待所有任务完成    WaitAll() 是一个静态方法。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });var completedTask = Task.WaitAll(task1, task2);

七、Task.WaitAny(Params Task[])

等待任意一个任务完成。   WaitAny() 是一个静态方法。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });var completedTask = Task.WaitAny(task1, task2);

八、Task.ContinueWith(Action continuationAction):

此方法用于在当前任务完成后执行另一个操作。这对于链式(嵌套)任务执行非常有用。(等待一个任务完成)  

// 正常情况下 t1 和 t2 不知道谁先执行完
Task<string> t1 = new Task<string>(F1);
Task<string> t2 = new Task<string>(F2);
Task<string> t3 = new Task<string>(F3);//t1先执行 t2后执行 
t1.ContinueWith(t =>
{// t1执行完之后 再去执行t2.Start(); //第二任务t2.ContinueWith(t4 =>{//第二个任务完成了//第三个任务对象t3.Start();t3.ContinueWith(t5 =>{Console.WriteLine("保证第三个任务完成");});});
});

九、Task.Start():

此方法用于手动启动先前创建的尚未启动的任务。通常,使用 Task.Run() 创建任务时,无需调用此方法,因为任务会自动启动。

var task = new Task(() => { /* 代码 */ });
task.Start();

注意:在使用 Task 类时,应始终考虑处理异常和取消操作。这可以通过使用 try-catch 语句和 CancellationToken 来实现。


TaskFactory工厂类

TaskFactory类是C#中用于创建和启动任务的工厂类。通过TaskFactory类可以方便地创建并行任务,然后通过调度器来控制任务的执行顺序。使得并行任务的管理变得更加方便和高效‌。

TaskFactory的主要功能和使用场景:

  • TaskFactory类的主要功能是创建和启动任务。通过TaskFactory,开发者可以方便地创建并行任务,并通过调度器控制任务的执行顺序

TaskFactory与Task.Run的区别

  • 虽然Task.Run和Task.Factory.StartNew都可以用来创建和启动任务,但它们在使用上有一些区别:
  • ‌Task.Run‌:这是.NET Core中推荐的方法,因为它更简洁且易于使用。Task.Run会自动选择合适的调度器,通常是在ThreadPool中执行任务。
  • ‌Task.Factory.StartNew‌:这是较早的方法,提供了更多的控制选项,例如可以指定自定义的调度器。然而,从.NET 4.0开始,建议使用Task.Run代替Task.Factory.StartNew,因为Task.Run更符合异步编程的最佳实践‌

以下是一些TaskFactory常用的方法:

一、StartNew()

方法用于启动一个新的Task,它接受一个Action委托作为参数,该委托定义了新任务要执行的代码。此外,它还有多个重载版本,可以接受不同的参数,如状态对象、取消令牌、任务创建选项和任务调度程序等。

Task task2 = taskFactory.StartNew(() =>{Console.WriteLine("Task 2 started");Thread.Sleep(1000);Console.WriteLine("Task 2 completed");});

二、ContinueWhenAll()

创建一个延续任务,该任务在一组指定的任务完成后开始。(等待所有任务完成)

Task t1 =  new Task(F1);
Task t2 = new Task(F2);
TaskFactory factory = new TaskFactory();
factory.ContinueWhenAll(new Task[] { t1, t2 }, t =>
{Console.WriteLine("俩个任务都完成的前提下再去执行");Console.WriteLine(sum1 + sum2);
});

三、ContinueWhenAny()

创建一个延续 Task,它将在提供的组中的任何任务完成后马上开始。(只要有任务完成)

Task t1 =  new Task(F1);
Task t2 = new Task(F2);
TaskFactory factory = new TaskFactory();
factory.ContinueWhenAny(new Task[] { t1, t2 }, t =>
{Console.WriteLine("任何一个任务完成就行");
});


本文部分借鉴与网络,如有侵权请联系删除!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503674.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式中QT实现文本与线程控制方法

第一:利用QT进行文件读写实现 利用QT进行读写文本的时候进行读写,读取MP3歌词的文本,对这个文件进行读写操作。 实例代码,利用Qfile,对文件进行读写。 //读取对应文件文件,头文件的实现。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…

书籍推荐:Kubernetes 修炼手册

这本书是 2020 年出版的&#xff0c;比较新&#xff0c;从 0 到 1 介绍了 k8s 中的相关技术和概念&#xff0c;翻译质量也可以&#xff0c;适合作为初学 k8s 的课外书。 书中比较关键的就是中间那几个章节&#xff0c;基本掌握 k8s 中 Pod、svc、StatefulSet、ConfigMap、Volum…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

三极管工作状态分析

NPN三极管 下面是NPN三极管&#xff08;也称N管&#xff09;的标识和内部结构图&#xff1a; NPN三极管由两个PN结构成&#xff0c;靠近C&#xff08;集电极&#xff09;一侧的PN结称为集电结&#xff1b;靠近E&#xff08;发射极&#xff09;一侧的PN结称为发射结&#xff1…

基于RedHat9部署WordPress+WooCommerce架设购物网站

系统版本信息&#xff1a;Red Hat Enterprise Linux release 9.2 (Plow) WordPress版本信息&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本信息&#xff1a;woocommerce.9.5.1 环境架构&#xff1a;LNMP&#xff08;RedHat9nginx1.20.1PHP 8.0.27MySQL8.0.30&#xff09; …

【雷达】雷达的分类

文章目录 前言类别性质主要雷达分系统及其现代技术发展国外发展 前言 前言 类别 性质 按作用分类 军用雷达&#xff1a;&#xff08;按载体&#xff09;地面雷达、舰载雷达、机载雷达、星载雷达、 艇载雷达、弹载雷达 民用雷达&#xff1a;交通管制雷达、港口管制雷达、气象雷…

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统&#xff0c;通过车身四周安装的超广角像机&#xff0c;经算法合成全景鸟瞰图&#xff0c;通过鸟瞰图&#xff0c;司机非常清楚的看清楚车辆四周情况&#xff0c;大大降低盲区引发的交通事故。 产…

微信小程序之历史上的今天

微信小程序之历史上的今天 需求描述 今天我们再来做一个小程序&#xff0c;主要是搜索历史上的今天发生了哪些大事&#xff0c;结果如下 当天的历史事件或者根据事件选择的历史事件的列表&#xff1a; 点击某个详细的历史事件以后看到详细信息&#xff1a; API申请和小程序…

PyCharm简单调试

本文简单讲述一下PyCharm中经常用到的调试操作。 示例代码如下&#xff1a; for i in range(10):print("hello", i)if i > 2:print("ok!")在代码前面打上断点&#xff0c;如下图所示&#xff1a; 单机调试按钮Debug 单机Resume Program按钮&#xf…

域名注册网国际域名与国内域名的区别

在当今互联网时代&#xff0c;域名注册是每个企业和个人建立在线存在的重要步骤。国际域名与国内域名之间存在一些显著的区别&#xff0c;这些区别影响着用户的选择和使用。 首先&#xff0c;国际域名通常以“.com”、“.net”、“.org”等后缀结尾&#xff0c;这些后缀具有全球…

Python 爬虫验证码识别

在我们进行爬虫的过程中&#xff0c;经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢&#xff1f;这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理&#xff08;边缘保留滤波、灰度化、二值化、…

【Unity笔记】资源包导入后是洋红色(粉色)怎么办?

1.导入后发现是这样的 2.这个问题是渲染管道不匹配引起的。 导入的素材用的是 「通用渲染管线 Universal Render Pipeline, URP」&#xff0c;而项目里默认配置的是「内置渲染管线」&#xff0c;如图&#xff1a; 【知识补充】什么是渲染管线&#xff1f;&#xff1f;&#x…

Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度

前言 近期产品需求&#xff1a;Vue2移动端项目需要在switch开关内显示文字&#xff0c;看Vantui没有对应功能&#xff0c;因此自己手撸写了这个组件。 一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-switch v-model"check"/>2、配置参数&#xff08;…

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例

Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

概率论与数理统计--期末

概率论占比更多&#xff0c;三分之二左右 数理统计会少一些 事件之间的概率 ab互斥&#xff0c;不是ab独立 古典概型吃高中基础&#xff0c;考的不会很多 条件概率公式&#xff0c;要记 公式不要全记&#xff0c;很多有名称的公式是通过基础公式转换而来的 目的在于解决一…

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

标准IO

student.c用链表完成 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct student {char name[10];int chinese;int math;int English;int physics;int chemistry;int biology; }stu,*stuptr; typedef struct node {union{stu dat…

Ollama + FastGPT搭建本地私有企业级AI知识库 (Linux)

一、为何搭建本地企业级AI知识库&#xff1f; 首先我们分析下搭建本地企业级AI知识库的核心要点&#xff1a; 1.数据安全性&#xff1a;本地部署可以更好地保护企业敏感数据&#xff0c;避免数据泄露的风险。 2.定制化&#xff1a;根据企业特定需求进行定制&#xff0c;提供更…

基于SMT32U575RIT单片机-中断练习

练习要求&#xff1a; 1、通过扩展板按键key1&#xff0c;开/关元器件&#xff1b; 2、通过串口选择模式&#xff08;通过中断实现&#xff09;&#xff1a; LED&#xff1a; 切换只控制LED&#xff1b; FAN&#xff1a; 切换只控制FAN&#xff1b; BEE&#xff1a; 切换只控制…

人工智能的发展领域之GPU加速计算的应用概述、架构介绍与教学过程

文章目录 一、架构介绍GPU算力平台概述优势与特点 二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置 三、创建实例实例创建步骤镜像选择与设置 四、连接实例SSH连接方法远程桌面配置 一、架构介绍 GPU算力平台概述 一个专注于GPU加速计算的…