70

Process.Close()当我启动一个进程并想关闭这个进程时,和有什么区别Process.Kill()

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

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

4

5 回答 5

71

Process.Close()和 和有什么区别process.Kill()

手册对此非常清楚:

Process.Close()

如果进程正在等待,Close 方法会导致进程停止等待退出,关闭进程句柄并清除特定于进程的属性。Close 不会关闭标准输出、输入和错误读取器和写入器,以防它们被外部引用。[即进程本身继续运行,您无法再使用您的Process实例控制它]

Process.Kill()

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

Process.CloseMainWindow

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


至于您的编辑:

我问是因为我有应用程序开始使用wireshark 和命令通过Windows = hidden 的命令行捕获数据包。

为此,请使用 WinPcap APIPcap.Net 库,而不是 Wireshark。

于 2012-12-19T12:50:06.933 回答
16

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

Close关闭 .NET 中进程的句柄,但实际上并不触及进程本身。Close也被Dispose. 请参阅Jon Skeet 的这个答案

第三个选项是CloseMainWindow,它通过要求关闭主窗口来优雅地关闭程序。这类似于右键单击任务栏上的程序并选择关闭。

于 2012-12-19T12:41:23.910 回答
7

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

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

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

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

于 2012-12-19T12:50:48.473 回答
4

让我来说明一下当您调用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();
于 2014-09-02T16:31:06.890 回答
2

Process.Kill 调用 TerminateProcess。

Process.Close 不会像您认为的那样做!它只是释放类实例使用的资源。请阅读:http: //msdn.microsoft.com/en-us/library/system.diagnostics.process.close.aspx

于 2012-12-19T12:42:00.080 回答