C#学习相关系列之多线程(七)---Task的相关属性用法

这篇具有很好参考价值的文章主要介绍了C#学习相关系列之多线程(七)---Task的相关属性用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Task和Thread的区别

  1. 任务是架构在线程之上的,任务最终的执行还是要给到线程去执行的。
  2. 任务和线程之间不是一对一的关系,任务更像线程池,任务相比线程池有很小的开销和精确的控制。(总的来说Task的用法更为先进,在多线程的时候应该优先考虑Task)

 二、Task的相关属性

1.status 当前状态类属性(较多) 

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

2. CurrentId:当前正在执行的任务id。(int)

3. IsCompleted:当前任务是否已经完成。(bool)

4. IsCanceled:任务是否由于被取消而完成。(bool)

5. ID:当前Task实例的Id。(int)
6. TaskCreationOptions 当前任务的优先级有以下七种:

  • None:默认行为。
  • PreferFairness: 以一种尽可能公平的方式安排任务,这意味着较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。
  • LongRuning:指定任务将是长时间运行的、粗粒度的操作,涉及比细化的系统更少、更大的组件。可以通过过度订阅创建比可用硬件线程数更多的线程。 它还将提示任务计划程序:该任务需要附加线程,以使任务不阻塞本地线程池队列中其他线程或工作项的向前推动。
  • AttachedToParent: 指定将任务附加到任务层次结构中的某个父级。
  • DenyChildAttach:指定任何尝试作为附加的子任务执行。
  • HideScheduler:防止环境计划程序被视为已创建任务的当前计划程序,当前计划程序。
  • RunContinuationsAsynchronously:强制添加到当前任务的延续任务。

 三、Task的常用方法

1.Wait(task) 等待当前task执行结束后执行。

代码演示:

        Task tt = Task.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(1);
                }
            });
            tt.Wait();
            for (int i = 0; i < 300; i++)
            {
                Console.Write(2);
            }
            Console.ReadKey();

当代码中无tt.wait()时候,运行结果为1和2交替出现,反之会在tt任务运行完后,也就是输出1完成后再输出2。

2.WaitAll() 等待所有任务执行完成 。
3.WaitAny() 等待任意一个任务执行完成就执行。
4.ContinueWith() 第一个Task结束后自动执行下一个。

代码演示:

            Task<int> tt = Task<int>.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(1);
                    
                }
                return 10;
            });
            tt.ContinueWith(T1 =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                }
                Console.WriteLine("tt的结果为:"+T1.Result);
            });

运行结果为:

C#学习相关系列之多线程(七)---Task的相关属性用法,C#从入门到精通系列,c#,学习

ContinueWith的用法是在一个任务执行完成之后执行的代码,需要注意的是T1为前一个任务返回的结果。
5.CancellationTokenSource 取消一个任务。
 文章来源地址https://www.toymoban.com/news/detail-734959.html

到了这里,关于C#学习相关系列之多线程(七)---Task的相关属性用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity的C#学习——多线程编程(线程的生命周期、创建与管理)与线程相关类

    多线程编程是 C# 一个比较难且涵盖面比较广的知识点,本文整理仓促而且属于笔记向博客,有些地方必然还存在不严谨和错误,本人会在日后的使用过程中不断完善。如果发现问题或有改进意见可以在评论区提出,我会及时修改。 线程是程序的执行流程,也被称为 轻量级进

    2024年02月12日
    浏览(45)
  • C#中多线程Task详解

    参考文章: 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 1.1Thread方式 缺点:频繁的创建和消耗比较好资源;提供操作线程的API不是马上响应(线程是

    2024年02月04日
    浏览(46)
  • C# task多线程创建,暂停,继续,结束使用

    1、多线程任务创建 2、线程暂停 3、线程继续 4、取消线程 完整版代码如下: 软件界面如下

    2024年02月11日
    浏览(46)
  • WPF跨线程访问UI对象之Dispatcher的用法(含Task)

    WPF程序员处理多线程的一个方式 - Dispatcher 当我们打开一个WPF应用程序即开启了一个进程,该进程中至少包含两个线程。 一个线程用于处理呈现:隐藏在后台运行 一个线程用于管理用户界面:接收输入、处理事件、绘制屏幕以及运行应用程序代码。即UI线程。 在UI线程中有一

    2024年02月16日
    浏览(40)
  • C# Task Parallel Library (TPL) 访问线程池

    //在C#中,可以使用Task Parallel Library (TPL)来访问线程池。 //TPL是一个用于并行编程的框架,它提供了一种简单的方式来创建并行任务, //并 自动利用线程池 来执行这些任务。 //下面是一个使用TPL访问线程池的示例: //csharp using System; using System.Threading.Tasks; class Program {     st

    2024年02月08日
    浏览(79)
  • C#学习相关系列之匿名方法和Lambda表达式

            匿名方法 顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。( Lambda 表达式 的本质也是 匿名方法

    2024年02月07日
    浏览(54)
  • 从零开始学习 Java:简单易懂的入门指南之多线程(三十四)

    1.1简单了解多线程 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。 1.2并发和并行 并行:在同一时刻,有多个指令在多个CPU上同时执行。 并发:在同一时刻,有多个指令在单个CPU上交

    2024年02月08日
    浏览(67)
  • C#中sort排序相关用法介绍

     C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数、多规则的复

    2024年02月15日
    浏览(60)
  • JavaEE之多线程编程:4. 线程安全(重点!!!)

    下面我们来举个例子: 我们大家都知道,在单线程中,以下的代码100%是正确的。 但是,两个线程,并发的进行上述循环,此时逻辑可能就出现问题了。 上述这样的情况就是非常典型的线程安全问题。这种情况就是bug!! 只要实际结果和预期的结果不符合,就一定是bug。 想

    2024年01月25日
    浏览(41)
  • 【云原生|探索 Kubernetes 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法

    大家好,我是秋意零。 本专栏上一篇中,我们介绍了 Pod 的核心思想以及 Pod 的工作原理。今天我们还是探讨 Pod ,聊一聊 Pod 的基本概念。 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛” ,并斩获多项奖项荣

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包