欢迎光临
个人技术文档整理

.Net多线程的几种实现方式

计算机概念

进程

  • 程序在服务器上运行时,占据的计算资源合集,称之为进程

  • 进程之间不会相互干扰---进程间的通信比较困难(分布式)

线程

  • 程序执行的最小单位,响应操作的最小执行流,

  • 线程也包含自己的计算资源,

  • 线程是属于进程的,一个进程可以有多个线程

多线程

  • 一个进程里面,有多个线程并发执行

 

Task类创建多线程(推荐)

  • Task线程是基于线程池的
  • 供了丰富的API
  • Task被称之为多线程的最佳实践。
            Action action = () =>
            {
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
            };

            //方式1
            Task task = new Task(action);
            task.Start();


            //方式2
            Task.Run(action);

 

 

Thread类创建多线程

  • Thread的API特别丰富,可以玩的很花哨,但是,因为线程资源是操作系统管理的,响应并不灵敏,所以没那么好控制
  • Thread 启动线程是没有控制的,如果启动太多,可能导致死机,
            ThreadStart threadStart = () =>
            {
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
            };
            Thread thread = new Thread(threadStart);
            thread.Start();


            //写法2 DoTask为一个方法
            new Thread(DoTask).Start();

 

 

ThreadPool类创建多线程

  • ThreadPool:池化资源管理设计思想, 池化就是做一个容器,容器提前申请N个线程,程序需要使用线程,直接找容器获取,用完后再放回容器(控制状态),避免频繁的申请和销毁;容器自己还会根据限制的数量去申请和释放;
  •  线程复用
  • 可以限制最大线程数量
  • api太少,线程等待顺序控制很弱。
            WaitCallback waitCallback = action =>
            {
                Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}");
            };
            ThreadPool.QueueUserWorkItem(waitCallback);

 

 

委托方式创建多线程

            Action action = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}"); };
            IAsyncResult asyncResult = action.BeginInvoke(null, null);

 

 

Parallel创建多线程

  • Parallel可以启动多个线程去并发执行多个Action,它是多线程的。Parallel最直观的特点是主线程(当前线程)也会参与计算---阻塞界面(主线程忙于计算,无暇他顾)。
  • Parallel是在Task的基础上做了一个封装,它的效果等于TaskWaitAll+主线程(当前线程)参与计算。
            Action action = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action--执行结束---{DateTime.Now}"); };
            Action action2 = () => { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ---action2--执行结束---{DateTime.Now}"); };
            Action[] actions = new Action[] { action, action2 };
            Parallel.Invoke(actions);

 

 

 

 

 

赞(2)