如果我在C#控制台应用程序中不关闭System.Diagnostics.Process会发生什么?

5
我有一个C#应用程序,使用System.Diagnostics.Process运行另一个exe。我遇到了一些示例代码,在其中进程在try块中启动并在finally块中关闭。我还看到了没有关闭进程的示例代码。
当进程未关闭时会发生什么?
当创建进程的控制台应用程序关闭时,该进程使用的资源是否会被回收?
在长时间运行的控制台应用程序中打开许多进程而不关闭它们是不好的吗?
干杯!
3个回答

14
当其他进程“退出”时,它的所有资源都被释放了,但是除非您在Process引用上调用Close(),否则您仍将持有一个进程句柄(该句柄是指向有关该进程的信息块的指针)。我怀疑不会有太大问题,但您最好还是这样做。 Process实现了IDisposable,因此您可以使用C#的using(...)语句,它将自动为您调用Dispose(从而调用Close()):
using (Process p = Process.Start(...))
{
  ...
}

作为一条经验法则:如果某个东西实现了IDisposable接口,你真的应该调用Dispose/Close方法或在其上使用using(...)语句。


4
请注意,调用进程的 Close() 方法并不会导致该进程退出。 - Declan Shanaghy

1

它们将会持续运行,就像你亲自启动它们一样。


1

进程是一个独立的实体。通过编程创建进程与从桌面启动进程基本相同。

你所创建的进程的句柄仅为方便而返回。例如,为了访问其输入和输出流或(正如你所看到的)杀死它。

当父进程被终止时,并不会回收资源。

唯一糟糕的情况是打开太多进程,导致CPU和RAM无法处理!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接