工控上位机C#中的进程、线程与多线程


(一)、什么是进程?
计算机概念 , 程序在服务器运行时占据全部计算资源总和虚拟的 , 当一个程序开始运行时 , 它就是一个进程 , 进程包括运行中的程序和程序所使用到的内存和系统资源 。 而一个进程又是由多个线程所组成的 。
(二)、什么是线程?
线程是程序中的一个执行流 , 它纯是一个计算机概念 , 进程在响应操作时最小单位 , 也包含CPU 内存 网络 硬盘IO 虚拟的概念 , 更加看不见摸不着 , 每个线程都有自己的专有寄存器(栈指针、程序计数器等) , 但代码区是共享的 , 即不同的线程可以执行同样的函数 。
(三)、线程和进程的关系?
一个进程会包含多个线程:线程是隶属于某个进程 , 进程销毁 , 线程则消失
(四) 、句柄:
其实是个long数字 , 是操作系统标识应用程序
(五)、什么是多线程?
多线程是指程序中包含多个执行流 , 即在一个程序中可以同时运行多个不同的线程来执行不同的任务 , 也就是说允许单个程序创建多个并行执行的线程来完成各自的任务 。
(六)、为什么可以多线程呢?
1、多个CPU的核可以并行工作 , 4核8线程 , 这里的线程指的是模拟核
2、 CPU分片 , 1s的处理能力分成1000份 , 操作系统调度着去响应不同的任务;从宏观角度来说 , 感觉就是多个任务在并发执行;从微观角度来说 , 一个物理cpu同一时刻只能为一个任务服务
(七)、 C#里面的多线程:
Thread类是C#语言对计算机的线程对象的一个封装 , 对Thread进行操作 , 并不是直接对计算机中的线程进行操作 , 用Thread开启线程 , .net framework需要去计算机申请线程 , 对Thread进行暂停或者停止操作 , .net framework也只是给操作系统发一个信号 , 它并不能真正的控制操作系统的底层线程 。 ThreadPool又是对Thread的一个封装 , 它提供了一个线程池 , 对C#中的Thread进行一个管理 。
(八)、多线程的好处:
可以提高CPU的利用率 。 在多线程程序中 , 一个线程必须等待的时候 , CPU可以运行其它的线程而不是等待 , 这样就大大提高了程序的效率 。
(九)、多线程的不利方面:
1、线程也是程序 , 所以线程需要占用内存 , 线程越多占用内存也越多;
2、多线程需要协调和管理 , 所以需要CPU时间跟踪线程;
3、线程之间对共享资源的访问会相互影响 , 必须解决竞用共享资源的问题;
4、线程太多会导致控制太复杂 , 最终可能造成很多Bug;
(十)、何时使用多线程
多线程程序一般被用来在后台执行耗时的任务 。 主线程保持运行 , 并且工作线程做它的后台工作 。 对于Windows Forms程序来说 , 如果主线程试图执行冗长的操作 , 键盘和鼠标的操作会变得迟钝 , 程序也会失去响应 。 由于这个原因 , 应该在工作线程中运行一个耗时任务时添加一个工作线程 , 即使在主线程上有一个有好的提示“处理中...” , 以防止工作无法继续 。 这就避免了程序出现由操作系统提示的“没有相应” , 来诱使用户强制结束程序的进程而导致错误 。 模式对话框还允许实现“取消”功能 , 允许继续接收事件 , 而实际的任务已被工作线程完成 。 BackgroundWorker恰好可以辅助完成这一功能 。
在没有用户界面的程序里 , 比如说Windows Service ,多线程在当一个任务有潜在的耗时 , 因为它在等待另台电脑的响应(比如一个应用服务器 , 数据库服务器 , 或者一个客户端)的实现特别有意义 。 用工作线程完成任务意味着主线程可以立即做其它的事情 。
另一个多线程的用途是在方法中完成一个复杂的计算工作 。 这个方法会在多核的电脑上运行的更快 , 如果工作量被多个线程分开的话(使用Environment.ProcessorCount属性来侦测处理芯片的数量) 。
【工控上位机C#中的进程、线程与多线程】