Close()
System.Diagnostics.Process 类是否需要该方法?
编辑:Process
正在监视一个控制台应用程序,该应用程序几乎立即终止......
比利3
Close()
System.Diagnostics.Process 类是否需要该方法?
编辑:Process
正在监视一个控制台应用程序,该应用程序几乎立即终止......
比利3
是的。
但是请注意,这Close
仅与释放应用程序本地的资源有关。它不会尝试终止进程。为此,您必须调用CloseMainWindow()
(对于 GUI 应用程序)或Kill()
(对于任何应用程序)。
类Process
implements 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
。然而,这与这个问题无关。)
不,不一定。
始终调用任何 IDisposable(例如 Process 实例)的 Dispose()(或包装在 using 语句中)通常是一种很好的做法。但是,如果编写得当,GC 最终将在终结器中执行所有清理,即使您不这样做。
根据分配的资源,这可能会在一段时间内对内存/资源造成重大“打击”,也可能不会。在进程的情况下,您将持有一个进程句柄(相对较小),直到 GC 收集并最终确定对象,这可能不会对您的程序整体产生太大影响。
这不是致命的 - 垃圾收集器Process
最终会调用 ' 终结器,并且对象的资源将通过这种方式被清理。
不过,最好的做法是在不需要资源时立即释放资源,方法是Close
直接调用或将代码包装在一个using
块中。这样可以减少垃圾收集器的负载,并且可以提前而不是稍后释放一点内存。
Close
(或Dispose
)将释放(可能授予相对少量的)操作系统范围的资源。这些是您与系统上的所有其他进程共享的东西,因此作为一个好公民,您应该尽可能及时地发布它们。
最终,它们将通过垃圾收集器运行终结器或当您的进程终止时被释放。