繁体   English   中英

我必须处理 Process.Start(url) 吗?

[英]Do I have to Dispose Process.Start(url)?

简单的问题:我想使用默认浏览器打开一个 URL,所以我只做Process.Start(url) 但是,我注意到这会返回一个 IDisposable 对象。

所以现在我想知道我是否必须处理它? 或者,就此而言,我的应用程序是否以任何方式负责此过程? 预期的功能只是“即发即弃”,我不想让我的应用程序作为新进程的父进程,它不需要与之交互。

我在 SO 上看到了一些类似但不相关的问题,似乎说简单地在 URL 上调用 Process.Start 就可以了,但我不想遇到一些难以调试的内存泄漏/资源耗尽问题导致我的程序保持对长期失效的浏览器进程的引用。

如果您需要处理它,难道您不能将它包装在using子句中以确保 GC 执行它需要做的任何事情吗? 这仍然会允许某种“即发即忘”,但不会使内存/资源处于不良状态。

可能有点矫枉过正,但在 CodeProject 上有一篇关于 IDisposable 接口的非常好的文章: http : //www.codeproject.com/KB/dotnet/idisposable.aspx

你不可以。

void Main()
{
    Process result = Process.Start("http://www.google.com");

    if (result == null)
    {
        Console.WriteLine("It returned null");
    }
}

印刷

It returned null

从 MSDN(.NET Framework 4)上的Process.Start 方法(字符串):

如果要启动的可执行文件的地址是 URL,则不启动进程并返回 null。

(不过,一般来说, using语句是处理 IDisposable 对象的正确方法。WCF 客户端除外。)

启动进程是一个本地调用,它返回一个本地进程句柄,该句柄存储在返回的 Process 实例中。 Process 中有使用句柄的方法,因此您可以执行诸如等待进程退出或空闲等操作。

处理进程会释放该句柄。 我同意 Jon 的观点,将其包含在 using 子句中。

@Fooberichu 的回答是正确的,但我认为还值得指出的是,通常只有少数事情“需要”明确处理。

对象总是在某个时刻被有效地处理:

  • 每当 GC 进行收集时,它(最终)都会处理不再引用的对象。 因此,如果您不手动处置,该对象可能仍会在其超出范围后的几秒钟内被处置。
  • 当您的应用程序退出时,它持有的所有资源都将被释放。 (尽管 C#/.net 可能不会处理这些对象,但操作系统会收回您的进程获取的几乎所有内容。如果资源的生命周期超出了您的应用程序,则操作系统通常负责清理它)

因此,手动处置(或使用“使用”)的目的不是确保资源被释放,而是尽可能早释放它们

如今,您不太可能用完大多数类型的资源(例如内存、文件句柄或系统刷)。 但是,如果您在不需要时保留资源,您的程序可能会降低效率,您可能会使用不必要的内存,或者可能会通过暂时阻止其他应用程序执行有用的操作而导致延迟等。总的来说,处置是关于良好的礼仪、整洁和消除不必要的低效率。

在某些情况下必须释放资源(例如,如果您不关闭文件,则无法在程序或其他程序的其他位置打开/重命名/移动/删除它;如果您继续在图形上分配纹理卡而不释放它们,您将耗尽 VRAM 并且计算机的显示将失败),但一般来说,您将很少遇到这些情况,并且如果您遵循最佳实践(在不再需要对象时明确处理它们),您通常不需要知道这些情况何时发生,因为您已经在正确处理它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM