zoukankan      html  css  js  c++  java
  • C# Task详解 https://www.cnblogs.com/zhaoshujie/p/11082753.html

    C# Task详解  https://www.cnblogs.com/zhaoshujie/p/11082753.html

    1、Task的优势

      ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
      ◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
      ◆ ThreadPool不支持线程执行的先后次序;
      以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。
      以下是一个简单的任务示例:

    复制代码
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Task t = new Task(() =>
                {
                    Console.WriteLine("任务开始工作……");
                    //模拟工作过程
                    Thread.Sleep(5000);
                });
                t.Start();
                t.ContinueWith((task) =>
                {
                    Console.WriteLine("任务完成,完成时候的状态为:");
                    Console.WriteLine("IsCanceled={0}	IsCompleted={1}	IsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted);
                });
                Console.ReadKey();
            }
        }
    }
    复制代码

    2、Task的用法

      2.1、创建任务

      (一)无返回值的方式
      方式1:

      var t1 = new Task(() => TaskMethod("Task 1"));
      t1.Start();
      Task.WaitAll(t1);//等待所有任务结束 
      注:任务的状态:
      Start之前为:Created
      Start之后为:WaitingToRun 

      方式2:

      Task.Run(() => TaskMethod("Task 2"));

      方式3:

    复制代码
      Task.Factory.StartNew(() => TaskMethod("Task 3")); 直接异步的方法 
      //或者
      var t3=Task.Factory.StartNew(() => TaskMethod("Task 3"));
      Task.WaitAll(t3);//等待所有任务结束
      //任务的状态:
      Start之前为:Running
      Start之后为:Running
    复制代码
     View Code

      async/await的实现方式:

     View Code

      (二)带返回值的方式
      方式4:

      Task<int> task = CreateTask("Task 1");
      task.Start(); 
      int result = task.Result;
     View Code

        async/await的实现:

     View Code

      2.2、组合任务.ContinueWith

       简单Demo:

     View Code

       任务的串行:

     View Code

      子任务:

     View Code

      动态并行(TaskCreationOptions.AttachedToParent) 父任务等待所有子任务完成后 整个任务才算完成

     View Code

      2.3、取消任务 CancellationTokenSource

     View Code

      2.4、处理任务中的异常

      单个任务:

     View Code

      多个任务:

     View Code

        async/await的方式:

     View Code

      2.5、Task.FromResult的应用

     View Code

      2.6、使用IProgress实现异步编程的进程通知

      IProgress<in T>只提供了一个方法void Report(T value),通过Report方法把一个T类型的值报告给IProgress,然后IProgress<in T>的实现类Progress<in T>的构造函数接收类型为Action<T>的形参,通过这个委托让进度显示在UI界面中。

     View Code

      2.7、Factory.FromAsync的应用 (简APM模式(委托)转换为任务)(BeginXXX和EndXXX)

      带回调方式的

     View Code

      不带回调方式的

     View Code

     Task启动带参数和返回值的函数任务
     
    分类
  • 相关阅读:
    ZUCC2129 The Tree of Power(树形DP)
    ZUCC Flower Name(01字典树)
    JDBC 测试01
    CF1355E Restorer Distance(三分)
    CF1352E Special Permutation(桶排序+前缀和)
    CF1350E Orac and Game of Life(BFS)
    CF1350D Orac and Medians(找规律)
    Python机器学习(五十七)SciPy 积分
    Python机器学习(五十六)SciPy fftpack(傅里叶变换)
    Python机器学习(五十五)SciPy 常量
  • 原文地址:https://www.cnblogs.com/2eggs/p/13037771.html
Copyright © 2011-2022 走看看