System.Diagnostics.Process类需要Close()
方法吗?
编辑:Process
正在监控一个几乎立即终止的控制台应用程序......
Billy3
答案 0 :(得分:3)
是即可。
但请注意,Close
只需释放应用程序本地资源。 不尝试终止进程。为此,您必须调用CloseMainWindow()
(对于GUI应用程序)或Kill()
(对于任何应用程序)。
Process
类实现IDisposable
,严格来说,一旦你完成了对象,你就有义务调用Dispose
。但是,对于像这样的许多类,面向公众的Dispose
方法版本为Close
。
处理此类对象的最简单(也是最可靠)方法是使用using
块。一旦到达块的末尾,这将自动调用变量Dispose
。它还可以保护您免受异常情况的影响,防止您丢弃该对象。
例如:
using(System.Diagnostics.Process process = new System.Diagnostics.Process())
{
// set your properties and launch it
// wait for it to exit if you want to, or just let it continue to run
}
这在功能上等同于这样做:
System.Diagnostics.Process process = new System.Diagnostics.Process();
try
{
// set your properties and launch it
// wait for it to exit if you want to, or just let it continue to run
}
finally
{
process.Close();
}
(注意,我说功能相同,不等同于语义;实际上,using
块以IDisposable
为对象维护自己的句柄,然后调用Dispose
,而不是Close
{1}}。但是,这与这个问题无关。)
答案 1 :(得分:2)
不,不一定。
通常一个好的做法是始终调用Dispose()(或在using语句中包装)任何IDisposable,例如Process实例。但是,如果写得正确,GC最终会在终结器中执行所有清理工作,即使你没有。
根据分配的资源,这可能会在一段时间内对内存/资源造成重大“打击”,或者不是。在进程的情况下,你将持有一个进程句柄(相对较小),直到GC收集并完成对象,这可能不会对你的程序整体产生太大影响。
答案 2 :(得分:0)
这不是致命的 - 垃圾收集器最终将调用Process
的终结器,并且对象的资源将以这种方式清理。
但是,通过直接调用Close
或将代码包装在using
块中,可以在不需要时尽快释放资源。这样可以减少垃圾收集器的负载,并且可以提前释放一点内存,而不是以后。
答案 3 :(得分:0)
Close
(或Dispose
)将释放(可能是相对少量的)操作系统范围的资源。这些是您与系统上的其他每个进程共享的内容,因此要成为一个好公民,您应该尽可能及时地发布它们。
最终,虽然它们将通过运行终结器的垃圾收集器或当您的进程终止时释放。