编辑推荐: |
本文主要讲述了C# 对进程、线程概念的理解以及多线程与线程异步的区别。 希望能为大家提供一些参考或帮助。
文章来自于知乎,由火龙果Linda编辑推荐。 |
|
一、概念
进程:
• 进程是操作系统的一个基本概念,可以简单理解为“正在运行的程序” 。
• 进程之间是相互独立的。
• 利用Process类可启动、停止本机或远程进程。
线程:
• 一个进程划分为若干个独立的执行流,每个流都称为一个线程。
• 一个进程中既可以只包含一个线程,也可以同时包含多个线程。
进程与线程的关系如下图例所示:
1、C#中对进程的管理
(1)进程管理的内容:
(2)进程管理类(Process类)
Process类
• 引入System.Diagnostics命名空间
• Using System.Diagnostics
• 利用Process类,可以启动和停止本机进程、获取或设置进程优先级、确定进程状态,获取进程列表和各进程的资源占用情况等。
Process[] myProcesses = Process.GetProcesses( );
• Process类也可查询远程计算机上进程的相关信息
Process[] myProcesses = Process.GetProcesses("192.168.0.1");
(3)启动进程,控制界面
• 启动某个进程
01.设置startInfo属性
02.需要创建Process类的实例
03.关联StarInfo
04.调用Start方法启动该进程
05.等待启动成功
• 控制图形界面
• ProcessWindowStyle枚举指定进程如何显示窗口。
• Normal(正常窗口)
• Hidden(隐藏窗口)
• Minimized(最小化窗口)
• Maximized(最大化窗口
fileName:可执行文件的文件名称(应用程序的名称)
argument:可执行文件的路径(应用程序的路径)
(4)关闭进程
获取进程Handel
Process静态的GetProcessById方法
Process静态的GetProcessesByName方法
• 停止进程
• Kill方法和CloseMainWindow方法
• 前者用于强行终止进程,后者只是请求终止进程
• HasExited属性
• HasExited属性用于判断启动的进程是否已经停止运行
(5)双进程守候
2.C#中对线程的线程的管理
3.C#中线程同步和异步的区别
同步调用会阻塞线程,如果是调用一项繁重的工作(如大量IO操作)可能会让程序停顿很长时间,造成糟糕的用户体验。
(1)任务Task类
• Task在线程池的基础上进行了优化,并提供了更多的API
• ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
• ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
• ThreadPool不支持线程执行的先后次序;
• 以往,如果开发者要实现上述功能,需要完成很多额外的工作
• Task 类专门擅长异步操作
• 下一小节,会有眼花缭乱的例子来进行异步操作
Task类 对应void方法 Task(Action)
Task<TResult>类 有返回值的方法 Task<TResult>(Func<TResult>)
4.多线程与异步的区别
相同点:多线程和异步操作都可以达到避免线程阻塞的目的。
区别:.net中的异步执行使用的是异步委托,委托将要执行的方法提交到.net线程池,由于线程池中的线程来执行异步方法,异步调用并不是要减小线程的开销,它的主要目的是让调用方法的主线程不需要同步等待这个方法的调用,从而让主线程继续执行他下面的代码。与此同时,系统会通过从线程池取出的一个线程来执行帮助我们将要写的数据发送到设备。由于不需要我们的等待,我们等于同时做了两件事情。这个效果跟自己另外启动了一个线程等待方式的写操作是一样的,异步线程可以令操作系统或.net线程池,系统可以根据吞吐量动态地管理线程池的大小。,
多线程:多线程是顺序执行,因此编程简单,线程的使用会给系统带来上下文切换的额外负担,并且线程间的共享变量也可能造成死锁。
在.net发展过程中,出现过四种可用于异步编程的技术。
很多功能强大的程序都是多线程,打开windows任务管理器,可以看到一个应用程序是由多个线程同时进行工作的。 |