闲来无事

学点新知识

之前就看过Task见过类似的用法

就是没有特意的去了解这个类

今天来了解下顺便记个笔记、、、

本质

Task是一个类,它是基于任务的异步模式而产生的

首次引入在Framework 4中

看到这里你一定会想到多线程Thread与线程池ThreadPool

而Task跟线程池的功能是很相似的

当我们用Task开启新任务的时候,系统会从线程池中调用线程

而Thread会在每次实例化的时候创建一个新的线程

如果你需要一个长时间的操作,请使用Task(Acton,TaskCreationOptions)构造函数中的
TaskCreationOptions.LongRunning,暗示任务调度器,将这个线程放在非线程池上执行

Task的启动方式

Start

New Task(Action)

class Program
   {
       static void Main(string[] args)
       {
           Task t = new Task(DoA);
           t.Start();
           Console.ReadKey();
       }
       static void DoA()
       {
           for (int i = 0; i < 100; i++)
           {
               Console.WriteLine("i={0}\n", i);
           }
       }
   }

Run

Task.Run(Action)

static void Main(string[] args)
       {
           Task.Run(() =>
           {
               for (int i = 0; i < 50; i++)
               {
                   Console.WriteLine("i={0}",i);
               }
           });
           Console.ReadKey();
       }

具有返回值的Task

Task.Run(Action)

Task<int> task = Task.Run<int>(() =>
         {
             int sum = 0;
             for (int i = 0; i < 50; i++)
             {
                 sum += 1;
             }
             return sum;
         });
         int result = task.Result;
         Console.WriteLine("运算结果是:{0}",result);//输出50
         Console.ReadKey();

Factory

Task.Factory.StartNew(Action)

Task t = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("i={0}", i);
                }
            });

Task中的wait

基本用法

默认情况下,Task 是有线程池中的异步线程执行

是否执行完成,可以通过Task的的属性IsCompleted 来判断

如果想在子线程工作完成之后,在进行后续主线程工作可以通过调用task.Wait() 来等待线程完成

调用Wait后,当前线程会被阻塞,直到到子线程完成

static void Main(string[] args)
       {
           Task t = Task.Run(() =>
             {
                 Thread.Sleep(500);
                 Console.WriteLine("Lance");
                 Thread.Sleep(500);
             });
           Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
           t.Wait();
           Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
       }

运行结果:

image

具有等待时间的Wait

static void Main(string[] args)
       {
           Task t = Task.Run(() =>
             {
                 Thread.Sleep(500);
                 Console.WriteLine("Lance");
                 Thread.Sleep(500);
             });
           Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
           bool IsComplate= t.Wait(200);
           Console.WriteLine("wait 200毫秒后 t.IsCompleted=" + t.IsCompleted);
           Thread.Sleep(1000);
           Console.WriteLine("t.IsCompleted=" + t.IsCompleted);
       }

运行结果:

image