C#多线程
C#多线程
一、首先了解下基本概念
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间的独立的,一个进程无法访问另一个进程的数据(当然不是一定的可以用分布式计算方式),一个进程运行失败也不会影响到其他进程的·运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。应用程序的一个运行例程,是应用的一次动态执行过程。
线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单元,一个进程可以包括若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.Net应用程序中,都是以Main()方法做为入口,当调用此方法时系统就会自动创建一个主线程。线程主要就是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。
简单理解就是:
计算机概念:
进程:程序在服务器上运行时,暂据的计算资源的合集,称之为进程。
进程之前不会相互干扰----就导致了进程之间的通讯比较困难(分布式)。
线程:程序执行的最小单位,响应操作的最小执行流,
线程也包含自己的计算资源,
线程是属于进程的,一个进程可以有多个线程。
多线程:一个进程里面,有多个线程并发执行。
C#:
多线程Thread:类,就是一个封装,是NetFramework对线程对象的抽象封装
通过Thread去完成的操作,最终是通过向操作系统请求得到的执行流
CurrentThread:当前线程--任何操作执行都是线程完成的,运行当前这句话的线程
ManagedThreadId:是.Net平台给Thread起的名字,就是个int值,尽量不重复
现在简单写多线程Thread的初步使用。
Console.WriteLine($"在调用 button1_Click Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")}"); { { ThreadStart threadStart = () => { this.DoSomethingLong("button1_Click"); }; Thread thread = new Thread(threadStart); thread.Start(); //开启一个新线程 } { ParameterizedThreadStart threadStart = ar => { this.DoSomethingLong("button1_Click"); }; Thread thread = new Thread(threadStart); thread.Start(); } }
private void DoSomethingLong(string name) { Console.WriteLine($"在调用DoSomethingLong Start {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")}"); long lResult = 0; Thread.Sleep(2000);//线程等待 Console.WriteLine($"在等待线程后********DoSomethingLong End {name}" + $"{Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")} {lResult}"); }
关于Thread还有
//thread.Abort);/终结线程其实是抛出一个异常都会有延时 //Thread.ResetAbortO;/是把终结的线程再次启用都会有延时 //thread.Priority=ThreadPriority.Highest:/是不是就可以保证是优先执行?设置高优先级,只是一个概率提升 //thread.IsBackground =true;//为后台线程进程结束,线程结束了 //thread.IsBackground=false;/前台线程进程结束后,任务执行完毕以后,线程才结束 //如果我们需要等待; //1、等待 //while(thread.ThreadState!=ThreadState.Stopped) //{ //Thread.Sleep(2000); //} //2、Join等待 //thread.Join();∥可以限时等待会阻塞,等待线程结束 //thread.Join(2000);∥可以限时等待,最多等待2000ms,超时以后就不等了
想在深入了解的可以去https://www.cnblogs.com/w6w6/p/10648921.html这位大佬那里看看