当我开始一个流程并希望关闭此流程时,Process.Close()
和Process.Kill()
之间有什么区别?
我问,因为我有一个应用程序,它使用Wireshark通过命令行Windows = hidden
开始捕获数据包。
因此,当我想要停止捕获时,我会终止进程。因此有时捕获会打开,并显示错误,即最后一个数据包在中间被切断,所以我想知道可以在close()
之前使用kill()
解决此问题问题?
当我开始捕捉时,我可以通过按Ctrl + C关闭它,但在我的情况下,我以隐藏状态打开窗口,我可以通过我的代码执行类似的操作吗?
答案 0 :(得分:61)
Process.Close()
和process.Kill()
之间有什么区别?
手册非常明确:
Close方法会导致进程在等待时停止等待退出,关闭进程句柄并清除特定于进程的属性。关闭不会关闭标准输出,输入和错误读取器和写入器,以防它们被外部引用。 [即流程本身一直在运行,你只是无法使用
来控制它Process
实例]
Kill强制终止进程,而CloseMainWindow仅请求终止。 [...]通过调用CloseMainWindow退出进程的请求不会强制应用程序退出。应用程序可以在退出前请求用户验证,也可以拒绝退出。要强制退出应用程序,请使用Kill方法。 CloseMainWindow的行为与使用系统菜单关闭应用程序主窗口的用户的行为相同。因此,通过关闭主窗口退出进程的请求不会强制应用程序立即退出。
通过向主窗口发送关闭消息来关闭具有用户界面的进程。
至于你的编辑:
我问,因为我有应用程序谁开始使用wireshark捕获数据包通过命令行与Windows =隐藏命令行。
Use the WinPcap API或Pcap.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