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