• 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执行结束后执行。

    代码演示:

    1. Task tt = Task.Run(() =>
    2. {
    3. for (int i = 0; i < 300; i++)
    4. {
    5. Console.Write(1);
    6. }
    7. });
    8. tt.Wait();
    9. for (int i = 0; i < 300; i++)
    10. {
    11. Console.Write(2);
    12. }
    13. Console.ReadKey();

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

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

    代码演示:

    1. Task<int> tt = Task<int>.Run(() =>
    2. {
    3. for (int i = 0; i < 300; i++)
    4. {
    5. Console.Write(1);
    6. }
    7. return 10;
    8. });
    9. tt.ContinueWith(T1 =>
    10. {
    11. for (int i = 0; i < 300; i++)
    12. {
    13. Console.Write(2);
    14. }
    15. Console.WriteLine("tt的结果为:"+T1.Result);
    16. });

    运行结果为:

    ContinueWith的用法是在一个任务执行完成之后执行的代码,需要注意的是T1为前一个任务返回的结果。
    5.CancellationTokenSource 取消一个任务。
     

  • 相关阅读:
    算法宝典——Java版本(持续更新)
    分布式锁3:基于redis的插件redission实现分布式锁
    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第十一章 攻击性取证
    【网络安全】跨站脚本攻击(XSS)
    MATLIB从excel表中读取数据并画出函数图像
    中倍健未来数智药房首获红杉中国1千万美元天使轮融资
    函数的极限:如何通过 δ 和 ϵ 来定义一个连续的函数
    淘宝/天猫优惠券查询 API 返回值说明
    闲话 ASP.NET Core 数据校验(一):内置数据校验
    python二次开发Solidworks:读取立方体的高度
  • 原文地址:https://blog.csdn.net/qiaodahua/article/details/134095345