【问题标题】:What happens if I don't close a System.Diagnostics.Process in my C# console app?如果我不关闭 C# 控制台应用程序中的 System.Diagnostics.Process 会发生什么?
【发布时间】:2008-10-08 23:15:23
【问题描述】:

我有一个 C# 应用程序,它使用 System.Diagnostics.Process 来运行另一个 exe。我遇到了一些示例代码,其中进程在 try 块中启动并在 finally 块中关闭。我还看到了进程未关闭的示例代码。

当进程没有关闭时会发生什么?

当创建进程的控制台应用关闭时,进程使用的资源是否被回收?

在长时间打开的控制台应用程序中打开大量进程而不关闭其中任何一个是不是很糟糕?

干杯!

【问题讨论】:

    标签: c# process


    【解决方案1】:

    当另一个进程退出时,所有它的资源都被释放了,但是你仍然会持有一个进程句柄(它是一个指向块的指针)有关该过程的信息),除非您在 Process 参考上致电 Close()。我怀疑会有很多问题,但是你也可以Process 实现了IDisposable,所以你可以使用C# 的using(...) 语句,它会自动调用Dispose(因此Close()) 为您服务:

    using (Process p = Process.Start(...))
    {
      ...
    }
    

    根据经验:如果某些东西实现了IDisposable,您真的应该调用Dispose/Close 或使用using(...)

    【讨论】:

    • 请注意,对进程调用 Close 不会导致进程退出。
    【解决方案2】:

    它们将继续运行,就像您自己启动它们一样。

    【讨论】:

      【解决方案3】:

      进程是一个独立的实体。 以编程方式创建进程与从桌面启动进程大致相同。

      您创建的进程的句柄只是为了方便而返回。例如访问它的输入和输出流或(如您所见)杀死它。

      父进程被杀死时资源不会被回收。

      打开大量进程唯一不好的情况是,如果您打开的进程太多以至于 CPU 和 RAM 无法处理它!

      【讨论】:

        猜你喜欢
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 2016-09-14
        相关资源
        最近更新 更多