没有调用Process.Close()是否存在严重问题?

时间:2010-06-28 16:17:39

标签: .net system.diagnostics

System.Diagnostics.Process类需要Close()方法吗?

编辑:Process正在监控一个几乎立即终止的控制台应用程序......

Billy3

4 个答案:

答案 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)将释放(可能是相对少量的)操作系统范围的资源。这些是您与系统上的其他每个进程共享的内容,因此要成为一个好公民,您应该尽可能及时地发布它们。

最终,虽然它们将通过运行终结器的垃圾收集器或当您的进程终止时释放。