zoukankan      html  css  js  c++  java
  • C# Task总结(异步操作+并行)

    任务Task与线程Thread不可比。Task是为了利用多CPU多核的机制而将一个大任务不断分解成小任务,这些任务具体由哪一个线程或当前线程执行由OS来决定。如果你想自己控制由哪一个Thread执行,要么自己定议task的scheduling, 要么自己来创建Thread来执行代码。

    1)task是根据自己需要调用线程

    2)thread就是个基本单位

    简单地du说,thread是单核多线程,task是多核多线程

     /// <summary>
     /// 简单的task创建方式演示
     /// </summary>
     private static void TaskCreatFun()
     {
         // 其一、通过传统的 new 方式来实例化一个task对象,这种方式需要手动通过start来启动
         Task newTask = new Task(() =>
         {
             Thread.Sleep(1000);
             Console.WriteLine($"Hello Engineer, 我是 new 的一个task,线程ID:Thread.CurrentThread.ManagedThreadId}");
         });
    
         // 启动 tsak
         newTask.Start();
    
         // 其二、通过工厂 factory 来生成一个task对象,并自启动
         Task factoryTask = Task.Factory.StartNew(() =>
         {
             Thread.Sleep(1000);
             Console.WriteLine($"Hello Engineer, 我是 factory 生产 的一个task,线程ID:Thread.CurrentThread.ManagedThreadId}");
         });
    
         // 其三、通过 Task.Run(Action action) 来创建一个自启动task
         Task runTask = Task.Run(() =>
         {
             Thread.Sleep(1000);
             Console.WriteLine($"Hello Engineer, 我是 Task.Run 创建一个自启动task,线程ID:Thread.CurrentThread.ManagedThreadId}");
         });
         runTask.RunSynchronously();
    
         Console.WriteLine($"Hello Engineer, 我是主线程啦!线程ID{Thread.CurrentThread.ManagedThreadId}");
     }
    

      Task回调

      a.某一个任务结束回调

     taskList.Add(taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_002")));
     taskList.Add(taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_001")));
     //回调ContinueWhenAny没有那么精准,不一定是在某个线程完成之后发生
     taskList.Add(taskFactory.ContinueWhenAny(taskList.ToArray(), t =>      Console.WriteLine($"ContinueWhenAny {Thread.CurrentThread.ManagedThreadId.ToString("00")}")));
    

      b.所有任务结束回调

    taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray(), tList => Console.WriteLine($"这里是ContinueWhenAll {Thread.CurrentThread.ManagedThreadId.ToString("00")}")));
    

      c.单个任务结束回调

    Task task2 = taskFactory.StartNew(t => this.DoSomethingLong("btnTask_Click_005"), "煎饼果子").ContinueWith(t => Console.WriteLine($"这里是{t.AsyncState}的回调"));
    

      Task等待

    Task.WaitAny(taskList.ToArray());//卡界面
    
    Task.WaitAll(taskList.ToArray());//卡界面
    

      Task获取返回结果

    Task<int> intTask = taskFactory.StartNew(() => 123);
    int iResult = intTask.Result;
    Task<string> intTask = taskFactory.StartNew(() => "123");
    int iResult = intTask.Result;

      Task同步执行

    可以用task.RunSynchronously() 来同步执行,但是这种方式执行,只有通过new 实例化的task才有效,原因也很简单,其他两种方式创建task都已经自启动执行了,不可能在来一个同步启动执行吧。

    也可以通过task.wait()来变相的实现同步执行效果,当然也可以用task.Result来变现的实现,原理很简单,因为wait()和Result都是要阻塞主流程,直到task执行完毕

  • 相关阅读:
    《剑指offer》第五十五题(平衡二叉树)
    《剑指offer》第五十五题(二叉树的深度)
    《剑指offer》第五十四题(二叉搜索树的第k个结点)
    《剑指offer》第五十三题(数组中数值和下标相等的元素)
    《剑指offer》第五十三题(0到n-1中缺失的数字)
    《剑指offer》第五十三题(数字在排序数组中出现的次数)
    《剑指offer》第五十二题(两个链表的第一个公共结点)
    《剑指offer》第五十一题(数组中的逆序对)
    http://www.cnblogs.com/amylis_chen/archive/2010/07/15/1778217.html
    在做百度地图开发
  • 原文地址:https://www.cnblogs.com/itsone/p/13336242.html
Copyright © 2011-2022 走看看