kill进程和close进程有什么区别?

时间:2012-12-19 12:37:04

标签: c# process

当我开始一个流程并希望关闭此流程时,Process.Close()Process.Kill()之间有什么区别?

我问,因为我有一个应用程序,它使用Wireshark通过命令行Windows = hidden开始捕获数据包。 因此,当我想要停止捕获时,我会终止进程。因此有时捕获会打开,并显示错误,即最后一个数据包在中间被切断,所以我想知道可以在close()之前使用kill()解决此问题问题?

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

5 个答案:

答案 0 :(得分:61)

  

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

手册非常明确:

Process.Close()

  

Close方法会导致进程在等待时停止等待退出,关闭进程句柄并清除特定于进程的属性。关闭不会关闭标准输出,输入和错误读取器和写入器,以防它们被外部引用。 [即流程本身一直在运行,你只是无法使用Process实例]

来控制它

Process.Kill()

  

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

Process.CloseMainWindow

  

通过向主窗口发送关闭消息来关闭具有用户界面的进程。


至于你的编辑:

  

我问,因为我有应用程序谁开始使用wireshark捕获数据包通过命令行与Windows =隐藏命令行。

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

答案 1 :(得分:15)

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

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

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

答案 2 :(得分:6)

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

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

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

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

答案 3 :(得分:3)

让我举例说明当您致电关闭()和杀死()时视觉上会发生什么。以下将打开记事本,但在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();

答案 4 :(得分:1)

Process.Kill调用TerminateProcess。

Process.Close没有按照你的想法做到!它只是释放了类实例使用的资源。请阅读:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.close.aspx