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

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.mrgr.cn/news/82936.html

相关文章:

  • Java后端常用的4种请求方式(通俗易懂)
  • 深度学习驱动的蛋白质设计技术与实践
  • clickhouse query_log 常用查询语句
  • 【Linux】上传、下载、压缩、解压
  • 141.环形链表 142.环形链表II
  • Markdown中流程图的用法
  • ELK实战(最详细)
  • cuda实现flash_attn_mma_share_kv源码分析
  • 用VS C#构建Windows服务【纯操作版,附带项目地址】
  • [开源]自动化定位建图系统
  • A/B实验之置信检验(一):如何避免误判 (I类) 和漏报 (II类)
  • 137. 只出现一次的数字 II
  • 【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期
  • 9. C 语言 循环控制结构详解
  • 数据传送类指令
  • 【Linux】上传、下载、压缩、解压
  • Python 模拟登录网页,或者编写爬虫时模拟登录的详细总结
  • 【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则
  • 30天开发操作系统 第 12 天 -- 定时器
  • Java虚拟机面试题:JVM调优
  • [创业之路-241]:《从偶然到必然-华为研发投资与管理实践》-2- IPD流程中的业务线、技术线、职能支撑线
  • Web渗透测试之XSS跨站脚本 原理 出现的原因 出现的位置 测试的方法 危害 防御手段 面试题 一篇文章给你说的明明白白
  • Effective C++读书笔记——item11(自赋值)
  • 来说数据库
  • C++ Qt练习项目 QChar功能测试
  • 尚硅谷· vue3+ts 知识点学习整理 |14h的课程(持续更ing)