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

.net 不调用Process.Close()是否存在严重问题?,.net,system.diagnostics,.net,System.diagnostics,System.Diagnostics.Process类是否需要Close()方法 编辑:进程正在监视一个几乎立即终止的控制台应用程序 Billy3这不是致命的-垃圾收集器最终将调用进程的终结器,对象的资源将以这种方式清理 不过,最好的做法是在不需要资源时立即释放资源,方法是直接调用Close,或者使用块将代码包装到中。这样可以减少垃圾收集器的负载,并且可以更早而不是更晚地释放一点内存。这不是致命的-垃圾收集器最终将调用进程的终结器,并且对象的资源将以这种方式清理 不过,最好的做法是在不需要资源时

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

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


Billy3

这不是致命的-垃圾收集器最终将调用
进程的终结器,对象的资源将以这种方式清理


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

这不是致命的-垃圾收集器最终将调用进程的终结器,并且对象的资源将以这种方式清理

不过,最好的做法是在不需要资源时立即释放资源,方法是直接调用
Close
,或者使用
块将代码包装到
中。这样可以减少垃圾收集器上的负载,并且更早而不是更晚地释放一点内存。

不,不一定

通常,最好总是调用Dispose()(或在using语句中包装)任何IDisposable,例如流程实例。但是,如果编写正确,GC最终将在终结器中执行所有清理,即使您没有这样做

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

不,不一定

通常,最好总是调用Dispose()(或在using语句中包装)任何IDisposable,例如流程实例。但是,如果编写正确,GC最终将在终结器中执行所有清理,即使您没有这样做

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

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

尽管它们最终将通过运行终结器的垃圾收集器释放,或者在进程终止时释放。

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

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

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

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

处理此类对象最简单(也是最可靠)的方法是使用
块。一旦到达块的末尾,这将自动调用变量的
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
。但是,这与这个问题无关。)

Yes

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

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

处理此类对象最简单(也是最可靠)的方法是使用
块。一旦到达块的末尾,这将自动调用变量的
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
。但是,这与这个问题无关。)

我不这么认为