1

Close()System.Diagnostics.Process 类是否需要该方法?

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

比利3

4

4 回答 4

3

的。

但是请注意,这Close仅与释放应用程序本地的资源有关。它不会尝试终止进程。为此,您必须调用CloseMainWindow()(对于 GUI 应用程序)或Kill()(对于任何应用程序)。

Processimplements IDisposable,严格来说,它要求Dispose您在完成对象后调用。但是,对于许多这样的类,该方法的面向公众的版本DisposeClose.

处理此类对象的最简单(也是最可靠)的方法是使用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。然而,这与这个问题无关。)

于 2010-06-28T16:32:19.910 回答
2

不,不一定。

始终调用任何 IDisposable(例如 Process 实例)的 Dispose()(或包装在 using 语句中)通常是一种很好的做法。但是,如果编写得当,GC 最终将在终结器中执行所有清理,即使您不这样做。

根据分配的资源,这可能会在一段时间内对内存/资源造成重大“打击”,也可能不会。在进程的情况下,您将持有一个进程句柄(相对较小),直到 GC 收集并最终确定对象,这可能不会对您的程序整体产生太大影响。

于 2010-06-28T16:22:14.973 回答
0

这不是致命的 - 垃圾收集器Process最终会调用 ' 终结器,并且对象的资源将通过这种方式被清理。

不过,最好的做法是在不需要资源时立即释放资源,方法是Close直接调用或将代码包装在一个using块中。这样可以减少垃圾收集器的负载,并且可以提前而不是稍后释放一点内存。

于 2010-06-28T16:21:59.923 回答
0

Close(或Dispose)将释放(可能授予相对少量的)操作系统范围的资源。这些是您与系统上的所有其他进程共享的东西,因此作为一个好公民,您应该尽可能及时地发布它们。

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

于 2010-06-28T16:28:56.373 回答