前几天做 遇到一个问题:一个winform程序,当关闭窗体时,但是在任务管理器中任然存在,因为程序中用到了多线程。所以不能单方面的杀死进程,或释放程序占用资源。
这里说一下进程和线程的含义。进程就是程序在计算机上的一次执行活动,当你运行一个程序时,也就启动了一个进程。而,程序是死的,静态的,进程是活的,动态的。进程可以分为:系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们是处于运行状态下的操作系统本身;用户进程就是我们所启动的进程,也可以说是一些应用程序。很重要的一点:进程是系统进行资源分配的单位。
在Windows下进程又可以细化为线程,也就是一个进程下有多个能独立运行的更小的单位。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以再程序里独立执行,在一个应用程序里,可以设置多个线程,实现多线程多任务,异步执行,以此来提高程序的运行效率。
所以线程被 很多人称为轻量级进程,它负责在单个程序里执行多任务,通常有操作系统负责多个线程的调度和执行。
在。net中有System. Diagnostics.Process类,它可以完成对进程的一般性操作,比如创建、终止、例举等。,终止一个进程时,首先得到一个代表你所要终止的系统进程的Process对象,对于基于Windows窗口的应用程序来说,可以使用Process.CloseMainWindow()方法发送一个Close消息到应用主窗口;对于忽略CloseMainWindow()方法的基于应用窗口的应用程序和非基于应用窗口的应用程序,要调用Process.kill()方法来结束进程。
一旦得到你的想结束进程的Process对象,你就需要调用Process.CloseMainWindow()方法或Process.kill()。Process.CloseMainWindow()方法向基于窗口程序的主窗口发送一条关闭信息,这个信息的功能等同于用户从系统菜单上关闭主窗口,而且它可使应用执行正常的关闭公事。Process.CloseMainWindow()方法不能结束那些没有主窗口的程序,或不能操作的主窗口程序(例如一个当前并未显示的模态对话框),在这种情况下,Process.CloseMainWindow()方法返回false。
如果成功地发送了Close消息,Process.CloseMainWindow()方法返回true,但并不能保证进程确实关闭了。例如用来编程数据的应用在收到Close()消息以后,会提示用户是否保存当前未保存的数据,在这种情况下用户还是有机会忽略关闭操作的。如果用户忽略关闭,在这种情况下Process。CloseMainWindow()方法还回true,但应用程序任然在执行,这时你就可以用Process.WaitForExit()方法来指示进程结束,或用Process.HasExited属性来检测进程是否真的结束,如果没有,你可以用Process.kill()方法。
Process.kill()方法只是简单的立即去结束一个进程,用户没有机会去忽略结束,所以未保存的数据也都会丢失。如果想结束基于窗口但又对Process.CloseMainWindow()方法没有反应的应用程序进程,或是结束不基于窗口的应用程序进程,Process.Kill()方法是唯一的选择。