2012-12-19 174 views
48

当我开始一个过程并想关闭此过程时,Process.Close()Process.Kill()之间有什么区别?杀死进程和关闭进程有什么区别?

我问,因为我有一个应用程序开始捕捉包使用Wireshark命令通过命令行与Windows = hidden。 所以当我想停止捕获我杀死进程。所以有时捕获打开一个错误,最后一个数据包被中断,所以我想知道可以使用close()之前kill()将解决这个问题?

当我开始捕获时,我可以通过按Ctrl + C关闭它,但在我的情况下,我打开隐藏状态的窗口,我可以通过我的代码做类似的事情吗?

+2

http://stackoverflow.com/questions/673031/process-close-is-not-terminating-created-process-c –

回答

50

什么是Process.Close()process.Kill()之间的区别是什么?

该手册是相当清楚的是:

Process.Close()

Close方法使进程停止等待退出,如果它在等待,关闭进程句柄,并清除过程特定属性。关闭不会关闭标准输出,输入和错误读取器和写入器,以防外部引用它们。 [即

杀迫使过程的结束,而仅仅CloseMainWindow请求终止:本身保持运行的过程中,你就不能忍受了使用Process实例]

Process.Kill()控制。 [...]通过调用CloseMainWindow退出进程的请求不会强制应用程序退出。应用程序可以在退出前要求用户验证,否则可能会拒绝退出。要强制退出应用程序,请使用Kill方法。 CloseMainWindow的行为与使用系统菜单关闭应用程序主窗口的用户的行为相同。因此,通过关闭主窗口退出进程的请求不会强制应用程序立即退出。

Process.CloseMainWindow

关闭具有通过发送关闭消息到它的主窗口的用户界面的方法。


至于你的编辑:

我问,因为我有申请谁开始通过与Windows =隐藏命令行中使用Wireshark的使用命令来捕获数据包。

Use the WinPcap APIPcap.Net library for that,而不是Wireshark。

+0

当我开始捕捉时,我可以通过按Ctrl + C关闭它,但在我的情况下,我打开隐藏状态的窗口,我可以做些什么吗? – user1710944

+0

@ user1710944我不理解您的评论,但您应该仔细研究WinPcap API。在隐藏窗口中运行程序并不是真正推荐使用它们的逻辑和数据的方式,这就是API的用途。 – CodeCaster

10

Kill询问系统以毫不客气地终止进程(通过对Windows TerminateProcess系统调用的调用)。这类似于任务管理器中的结束进程。

Close关闭.NET中进程的句柄,但实际上并没有触及进程本身。 Close也被称为Dispose。见Jon Skeet的this answer

第三个选项是CloseMainWindow,其中确实通过询问主窗口关闭来正常关闭程序。这类似于右键单击任务栏上的程序并选择关闭。

+0

当然,如果该应用程序安装时终止CloseMainWindow只会终止应用程序其主窗口关闭。 –

4

杀死和关闭不是两个选项。如果要终止进程,则必须调用Kill(或CloseMainWindow)。调用关闭只会释放资源,但不会关闭标准流。自己关闭流可能会或可能不会导致流程结束,这取决于流程。最好的策略是根据进程的类型调用Kill或CloseMainWindow,然后处理Process对象。

Close开始关闭Process对象。它由Dispose调用。关闭通常用于管理Process对象的资源。

Kill终止该过程。这是终止没有用户界面的进程的唯一方法。

CloseMainWindow发送关闭消息到进程的主窗口。这是停止具有用户界面的流程的优雅方式。

2

让我来举例说明当您致电Close()和Kill()时,会发生什么情况。以下操作将打开记事本,但在执行myProcess.Close()时不会在最后退出记事本。

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Close(); 

以下将打开记事本。 10秒钟后,当执行myProcess.Kill()时,记事本将在最后关闭。

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Kill();