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

时间:2009-08-06 20:05:39

标签: c# .net

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

所以现在我想知道我是否必须处理它?或者,就此而言,如果我的应用程序以任何方式对此过程负责?预期的功能只是“一气呵成”,我不希望我的应用程序作为新进程的父进程,也不需要与它进行交互。

我在SO上看到了一些类似但不相关的问题,似乎只是说在URL上调用Process.Start很好,但我不想遇到一些难以调试的内存泄漏/资源耗尽问题导致我的问题我程序保持对长时间浏览器进程的引用。

4 个答案:

答案 0 :(得分:10)

不,你没有。

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

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

打印

It returned null

来自MSDN上的Process.Start Method (String)(.NET Framework 4):

  

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

(一般情况下,using语句是使用IDisposable对象的正确方法。WCF clients除外。)

答案 1 :(得分:9)

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

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

答案 2 :(得分:5)

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

处理进程释放了句柄。我同意Jon,将其包含在使用条款中。

答案 3 :(得分:3)

@Fooberichu的回答很明显,但我认为值得指出的是,通常只需要明确处理一些事情。

对象始终在某些点处有效处理:

  • 每当GC执行收集时,它(最终)将处置不再引用的对象。因此,如果您不手动处理,该对象可能会在超出范围的几秒钟内被丢弃。
  • 当您的应用程序退出时,它所持有的所有资源都将被释放。 (虽然对象可能不会被C#/ .net处理,但操作系统会回复你的进程抓取的任何东西。如果资源的生命周期超出了你的应用程序,那么操作系统通常负责清理它)

因此,手动处理(或使用'使用')的重点不是确保释放资源,而是尽早释放

现在,您不太可能耗尽大多数类型的资源(例如内存,文件句柄或系统画笔)。但是,如果您在不需要时保留资源,那么您的程序可能效率较低,可能会使用超过必要的内存,或者可能会暂时阻止其他应用程序执行有用的操作等导致延迟。一般来说,处理是关于良好的礼仪,整洁和削减不必要的低效率。

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