前言
本文主要涉及:
C#的线程(System.Threading.Thread)
线程池(System.Threading.ThreadPoll)
并行库(System.Threading.Tasks.Task)
异步(asnc await)
并发集合(System.Collections.Concurrent)
并行库(System.Threading.Tasks. Parallel)
简介
本文章使用的IDE为Visual Studio 2022,操作系统为Windows11。
在介绍C#多线程编程之前,需要简单的了解一下相关的名词。
操作系统
操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。所有的其他程序都要运行在操作系统之上。
CPU
CPU是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。
进程(Process)
简单来说一个进程就是一个应用程序。是操作系统进行资源(包括CPU、内存、磁盘IO等)分配的最小单位。
线程(thread)
线程是进程的一部分,是CPU执行进程的最小调度单位,。一个进程(程序)有一个或多个线程,多个线程并行执行不同的任务,所有线程共享该进程的资源。
进程与线程的区别
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
多线程
单核CPU上运行多线程程序, 同一时间只能运行一个线程, 操作系统使CPU在不同的线程上切换,,操作系统给每个线程分配时间片来执行, 每个时间片极短, 看起来像是多个线程同时运行。
多线程可以同时完成多个任务;可以使程序的响应速度更快;但是线程切换也会增加系统资源的开销,增加内存的占用。
使用Thread执行多线程
在C#中,线程是使用Thread类处理的,该类在System.Threading命名空间中。
使用Thread类创建一个对象t,
并指明将要调用的方法method()
使用new Thread(PrintNumbers); 指明在线程中执行的方法method()
使用t.Start()来启动线程。
具体代码如下所示:
1 internal void Do() 2 { 3 Thread t = new Thread(PrintNumbers); //创建一个Thread类的实例 4 t.Start();//启动线程,在线程t中执行PrintNumber 5 6 PrintNumbers();//在主线程执行PrintNumber 7 } 8 9 private void PrintNumbers() 10 { 11 Console.Write("开始..."); 12 for (int i = 1; i < 10; i++) 13 { 14 Console.WriteLine(i); 15 Thread.Sleep(TimeSpan.FromSeconds(0.3)); 16 } 17 Console.WriteLine("结束..."); 18 }
程序执行时,PrintNumbers()在主线程和另外一个线程t中同时执行。输出结果如图所示,1~10的数字会交叉出现。运行结果如下图所示: