【.NET Core】Task应用详解

简介: 笔记

一、概述


Task(任务)是一个类似于Thead(线程)或ThreadPool(线程池)概念是一个异步执行的工具类。它是一个更轻的类线程工具。Task提供简化编写并发和异步代码的工具类。它包含的类型为Task和Task。TaskFactory类提供用于创建和启动Task任务的静态方法。TaskScheduler类提供默认线程调度基础结构。


Task表示不返回值且通常异步执行的单个操作。Task对象是.NET Framework4中首次引入的基于任务的异步模式的核心组件之一。由于对象执行Task的工作通常在线程池线程上异步执行,而不是在main应用程序线程上同步执行,因此可以使用Statu属性以及IsCanceled、IsCompleted和IsFaulted属性来确定任务的状态。


二、Task用法应用


Task基本使用可以通过New实例化一个Task的应用,也使用通过StartNew来使用Task,还有一种是通过Run使用Task。下面实例通过代码演示三种Task基本的应用。


2.1 通过New实例化Task

Task task1=new Task(()=>{
    Thread.Sleep(1000);
    Debug.WriteLine("执行第一个Task任务.") 
});
Debug.WriteLine($"Task ID"+task1.id)

输出结果:

线程 0x6704 已退出,返回值为 0 (0x0)。
第一个任务ID13
执行第一个Task任务

2.2 通过Factory中StartNew方法

Task task2=new Task(()=>{
    Thread.Sleep(1500);
    Debug.WriteLine("执行第二个Task任务.") 
});
Debug.WriteLine($"Task2 ID"+task2.id);

2.3 通过Run方法

Task task3=new Task(()=>{
   Thread.Sleep(2000);
   Debug.WriteLine("执行第三个Task任务.");
})
Debug.WriteLine($"Task3 ID"+task3.id);

上面三种方法都可以创建一个Task应用。

类Task提供的异常三种创建任务和执行任务的方法。出于性能原因,Task.Run或TaskFactory.StartNew方法是创建和计划计算任务的首选机制,但对于必须分离创建和计划的方案,才考虑使用Task.Start方法计划任务以供以后执行。


三、让Task任务按顺序执行


Task task1 = new Task(() => { 
    Thread.Sleep(1000);
    Debug.WriteLine("执行第一个Task任务");
});
Task task2 = new Task(() => {
    Thread.Sleep(5000);
    Debug.WriteLine("执行第二个Task任务");
});
Task task3 = new Task(() => {
     Thread.Sleep(2000);
     Debug.WriteLine("执行第三个Task任务");
});
Task task4 = new Task(() => {
     Thread.Sleep(1000);
     Debug.WriteLine("执行第四个Task任务");
});
IList<Task> tasks= new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
tasks.Add(task4);
foreach (var task in tasks) {
    task.Start();
    task.Wait();
}

如果想要Task按顺序执行,需要给Task加上Wait方法,然后让其阻塞等待完成后在执行下一个Task任务。


四、通过异步Run方法异步执行顺序Task


 public async void RunTask() 
 {
     await Task.Run(async () =>{
         await Task.Delay(1000);
         Debug.WriteLine("第1个线程执行");
     });
     await Task.Run(async () =>{
          await Task.Delay(8000);
          Debug.WriteLine("第2个线程执行");
      });
     await Task.Run(async () =>{
          await Task.Delay(2000);
          Debug.WriteLine("第3个线程执行");
     });
     await Task.Run(async () =>{
          await Task.Delay(3000);
          Debug.WriteLine("第4个线程执行");
     });
}


通过异步await 和async通过 Task.Run创建按次序的Task任务。


五、创建带有返回值的Task


Task和Task暴露静态的Factory属性,该属性返回一个默认的TaskFactory实例,以便调用Task.Factory.StartNew()方法。Task和Taste有一个属性Result属性,该属性包含了运算的结果。任务是异步运行的,可能以任意时序执行完。若Result属性在运行结束前被访问,这个属性会阻塞调用线程到该值可访问。

public async void RunTask() 
{
      Task<Double>[] taskArray = { 
          Task<Double>.Factory.StartNew(() => DoComputation(10.0)),
          Task<Double>.Factory.StartNew(() => DoComputation(100.0)),
          Task<Double>.Factory.StartNew(() => DoComputation(1000.0)) 
      };
      foreach (var task in taskArray)
      {
           double result = task.Result;
           Debug.WriteLine(result);
      }
}

六、Task常用的属性与方法


6.1 AsyncStates属性

获取在创建Task时提供的状态对象,如果未提供,则为null。


6.2 CompletedTask属性

获取一个已成功的任务


6.2 CurrentId属性

返回当前正在执行Task的ID


6.3 Factory属性

提供对用于创建和配置Task和Task实例的工厂方法的访问


6.4 Id属性

获取此Task实例的ID


6.5 IsCanceled属性

获取此Task实例是否由于被取消的原因而完成执行


6.6 IsCompleted属性

获取一个值,它表示是否已完成任务


6.7 IsCompletedSuccessfully属性

了解任务是否运行到完成


6.7 IsFaulted属性

获取Task是否由于未经处理异常的原因而完成


6.8 Status属性

表示Task的生命周期中的当前阶段


  • 0 = Created 该任务已初始化,但尚未被计划
  • 1 = WaitingForActivation 该任务正在等待 .NET 基础结构在内部将其激活并进行计划。
  • 2 = WaitingToRun 该任务已被计划执行,但尚未开始执行
  • 3 = Running 该任务正在运行,但尚未完成
  • 4 = WaitingForChildrenToComplete 该任务已完成执行,正在隐式等待附加的子任务完成
  • 5 = RanToCompletion 已成功完成执行的任务
  • 6 = Canceled 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号
  • 7 = Faulted 由于未处理异常的原因而完成的任务


6.9 ConfigureAwait(Boolean) 方法

配置用于等待此Task的awaiter


6.10 ContinueWith(Action,Object,TaskScheduler) 方法

创建一个在目标Task完成时接收调用方提供的状态信息和取消标记并执行的延续任务。延续任务根据一组指定的条件执行,并使用指定的计划程序。


6.11 Delay(TimeSpan,CancellationToken) 方法

创建一个在指定的毫秒数后完成的可取消任务或创建一个指定的时间间隔后完成的可取消的任务。


6.12 Run(Action,CancellationToken) 方法

将在线程池上运行的指定工作排队,并返回代表该工作的 Task对象。 可使用取消标记来取消工作(如果尚未启动)。


6.13 Start(TaskScheduler) 方法

启动Task, 并将它安排到当前的TaskScheduler中执行


6.14 Wait(Task[],CancellationToken) 方法

等待提供的所有Task对象在指定的毫秒数内完成执行,或等到取消等待


6.15 Yield()方法

创建异步产生当前上下文的等待任务。


七、Task总结


Task是并行编程的一个重要的特性,主要的特点有一下几点:


  • 底层是在线程池中运作的,且微软用了一些增强性能的算法(这点使你在大部分场景中可以无忧地使用它)
  • 实际使用往往会结合lambda表达式
  • 结合lambda表达式在循环中使用计数器时,需要注意lambda内使用计数器是其引用。可以使用自定义传参给任务来回避这种情况

在实际的开发中还需要根据实际的应用场景,选项合适的属性和方法,希望你通过本文能完全掌握Task的应用。


七、参考资料


https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/task-parallel-library-tpl

目录
相关文章
|
3天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
3天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
3天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
2天前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
|
2天前
|
开发框架 物联网 测试技术
【专栏】.NET 开发:打造领先应用的基石
【4月更文挑战第29天】本文探讨了.NET开发框架为何成为构建领先应用的首选。高性能与稳定性是.NET的核心优势,它采用先进的技术和优化策略,如.NET Core的轻量级设计和JIT/AOT编译模式。跨平台兼容性让开发者能用相同代码库在不同操作系统上构建应用。现代化的开发体验,如C#语言的创新特性和Visual Studio的强大工具,提升了开发者生产力。丰富的生态系统和广泛支持,包括庞大的开发者社区和微软的持续投入,为.NET提供了坚实后盾。
|
2天前
|
机器学习/深度学习 人工智能 Cloud Native
【专栏】洞察.NET 技术的前沿应用
【4月更文挑战第29天】本文探讨了.NET技术的前沿应用,包括.NET Core的跨平台崛起、云原生及AI/机器学习领域的整合。.NET Core支持多平台运行,开源社区的参与促进了其快速发展和性能优化。Xamarin与.NET MAUI助力跨平台移动应用和统一界面开发,而云原生应用借助.NET Core与Azure云服务得以轻松构建和部署。此外,ML.NET和TensorFlow.NET为.NET开发者提供了机器学习和深度学习工具,推动智能应用和边缘计算的创新。.NET技术正持续演进,引领软件开发新趋势。
|
2天前
|
人工智能 物联网 开发者
【专栏】探究.NET 技术的创新应用
【4月更文挑战第29天】本文探讨了.NET技术的最新进展和创新应用,包括.NET 5及后续版本的统一平台、性能提升、跨平台支持、云集成优化和开源社区的贡献。在创新应用场景中,重点介绍了微服务架构、物联网、AI、游戏开发和移动应用。未来,.NET将持续优化性能,深化云原生应用,集成新兴技术,扩大社区生态,并促进相关教育和培训。开发者应把握.NET技术的潜力,积极参与其发展,创造更多创新软件产品。
|
3天前
|
安全 Linux API
【专栏】.NET 开发:打造卓越应用的秘诀
【4月更文挑战第29天】本文介绍了.NET技术的起源、核心特性和应用场景,揭示了其打造卓越应用的秘诀。自2002年推出,.NET历经发展,现支持跨平台,包括.NET Core和.NET 5。其核心特性包括:跨平台兼容性、面向对象编程、内置安全性和高效性能。丰富的类库、强大的开发工具、简洁的语言语法以及活跃的社区支持,使.NET成为构建高效、安全应用的理想选择。随着技术进步,.NET将持续赋能开发者创造更多可能性。
|
2天前
|
人工智能 安全 API
【专栏】理解 .NET 技术,打造优质应用
【4月更文挑战第29天】本文探讨了如何利用.NET技术构建高质量应用程序,介绍了.NET从2002年发展至今的历程,强调其跨平台能力、高效开发、丰富的类库和API、开源生态及安全性等优势。随着.NET 6的规划,平台将更加统一和跨平台,适应云计算、AI等新兴技术。.NET凭借其特性,成为开发者和企业创新的有力工具,未来将继续扮演重要角色。
|
2天前
|
机器学习/深度学习 自然语言处理 安全
【专栏】.NET 开发:构建智能应用的关键
【4月更文挑战第29天】本文探讨了.NET开发在构建智能应用中的关键作用,强调了其强大的框架、工具集、高效性能和跨平台支持。通过实例展示了.NET在人工智能、物联网及企业级应用中的应用。同时,指出了.NET开发面临的挑战,如技术更新的学习成本、性能优化、资源管理和安全隐私保护,并提出了应对策略。随着技术进步,.NET将在智能应用领域发挥更大作用,推动创新与便利。