多线程——Task

1.进程、线程、多线程、计算机概念

  进程:一个程序运行时,占用的全部计算机资源的总和

  线程:程序执行流的最小单位,任何操作都是由线程完成的;线程是依托于进程存在的,一个进程可以包含多个线程;线程也可以有自己的计算资源

  多线程:多个执行流同时运行,主要分为两种:其一CPU运算太快啦,分时间片——上下文切换(加载环境—计算—保存环境)  微观角度讲,一个核同一时刻只能执行一个线程;宏观的讲是多线程并发。其二,多CPU多核,可以独立工作,4核8线程——核指物理的核,线程指虚拟核

  多线程三大特点:不卡主线程、速度快、无序性

  Thread:C#语言对线程对象的封装

2.同步与异步

  同步:完成计算之后,再进入下一行,会阻塞

  异步:不会等待方法的完成,直接进入下一行,不会阻塞

3.不同C#版本线程的进化升级

C#1.0 Thread 线程等待、回调、前后台线程,可以扩展Thread封装回调,各种API函数很多,可设置线程优先级,各种API包括:Start(),Suspend(),Resume(),Abort(),Thread.ResetAbort(),Join(),
C#2.0 ThreadPool 线程池使用,设置线程池,等待可用ManualResetEvent,砍掉了很多API,可以设置线程池的最大最小数量
C#3.0 Task  

4.Task   

  引用using System.Threading  C#3.0才有、基于ThreadPool

        private void DoSomethingLong(string name)
        {
            Console.WriteLine($"****************DoSomethingLong {name} Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
            long lResult = 0;
            for (int i = 0; i < 1000000000; i++)
            {
                lResult += i;
            }
            Console.WriteLine($"****************DoSomethingLong {name}   End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} {lResult}***************");
        }
耗时的方法,无返回值,一个string输入参数
1 Task.Run(() => this.DoSomethingLong("btnTask_Click1"));
2 Task.Run(() => this.DoSomethingLong("btnTask_Click2"));
使用Task Run(Action action)运行一个新线程
TaskFactory taskFactory = Task.Factory;//4.0
taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click3"));
使用TaskFactory.StartNew(Action action)开启一个新线程
new Task(() => this.DoSomethingLong("btnTask_Click4")).Start();
直接new并start一个新线程

  以上三种启动方式并无区别,都是返回一个Task

猜你喜欢

转载自www.cnblogs.com/yangmengke2018/p/12237888.html
今日推荐