2009-08-06 80 views
11

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

所以现在我想知道我是否必须处置它?或者,就此而言,如果我的应用程序以任何方式对此过程负责?预期的功能只是简单的“火和遗忘”,我不希望我的应用程序作为新流程的父项,并且它不需要与它进行交互。

我见过一些类似但不相关的问题,似乎只是简单地调用URL上的Process.Start是好的,但我不想遇到一些难以调试引起的内存泄漏/资源耗尽问题我的程序保持对长期死亡的浏览器进程的引用。

回答

9

难道你不能把它包装在一个using子句中,以确保GC能够完成它所需的任何操作,如果你需要处理它的话?这仍然会允许某种“火灾和遗忘”,但不会使内存/资源处于不良状态。

可能是矫枉过正,但有大约IDisposable接口CodeProject上一个真正的好文章:http://www.codeproject.com/KB/dotnet/idisposable.aspx

+0

问题是我没有完全理解这种情况下的对象生活。如果我使用(Process.Start(url));那么它会在那个时候等待?或者是否会将流程部署到早期?目前,这在行为上没有任何区别,所以我认为没有任何资源是公开的,但我不确定,我不知道如何衡量。 – 2009-08-06 20:34:10

+0

由于“using”子句隐含地指示编译器构建try/finally并实现dispose,并且它们返回的是IDisposable对象,所以我认为您可以安全地执行此操作。通过不分配它,你可能会占用资源。你可以尝试构建一个循环,打开几个URL而不用处理它们,并查看你的资源是否失去控制,并通过将它们包装在使用子句中进行另一个测试。需要注意的是,之后你会有一堆窗户关闭。 :) – Fooberichu 2009-08-06 20:49:48

5

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

处置过程释放处理。我同意Jon的观点,将其包含在使用条款中。

10

不,你不知道。

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

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

打印

It returned null

Process.Start Method (String) MSDN上(.NET框架4):

如果可执行文件开始的地址是一个URL,过程 不开始并返回null。

(一般情况下,虽然,using说法是IDisposable的对象打交道的正确方法。除了WCF clients

+0

即使浏览器进程** IS **启动,它仍然返回null! – AgentFire 2015-06-09 17:15:42

+0

@AgentFire无论您的浏览器是否需要加载,您都会为URL获取空值。这就是要点 - 您不必在这种特定情况下处理(网址)。 – TrueWill 2015-06-11 20:40:53

2

@ Fooberichu的答案是当场就,但我认为这也是值得指出的是,通常只有一些“需要”被明确处置。

对象总是有效的配置在一些点:

  • 任何时候,GC做一个集合,它会(最终)处置那些不再被引用的对象。因此,如果您不手动处理,该对象可能仍会在超出范围的几秒内处理完毕。
  • 当您的应用程序退出时,它保存的所有资源都将被释放。 (虽然这些对象可能不会被C#/ .net处置,但操作系统将会声称你的进程已经抓住了很多东西。如果资源的寿命超出您的应用程序,那么OS通常负责打扫起来)

点的手动配置(或采用“使用”),因此不保证资源发布,但要尽快发布

现在,您不可能用尽大多数类型的资源(例如内存,文件句柄或系统画笔)。但是,如果您在不需要时继续使用资源,那么您的程序可能效率较低,您可能会使用比所需更多的内存,或者可能由于暂时阻止其他应用程序执行有用的事情而导致延迟等。一般来说,处置是关于良好的礼节,整洁和切割不必要的低效率。

有在资源必须释放少数情况下(例如,如果你不关闭文件,你可以不开/重命名/移动/从程序或其他程序的其他地方将其删除;如果您保持在你的显卡上分配纹理而不释放它们,你将用完VRAM并且计算机的显示将失败),但是一般情况下,你将不经常遇到这些情况,并且如果你遵循最佳实践(当物体“不再需要),你通常不需要知道这些情况何时发生,因为你已经正确地处理它们了。

+2

在许多情况下,IDisposable类没有终结器。如果他们没有被**明确处置GC'd,与他们相关的任何非托管资源将被泄露。在大多数情况下,框架类在保护我们方面做得很好,但最好的做法是始终处理IDisposable对象。这和WCF客户端碰巧是两个奇怪的边缘情况。 – TrueWill 2013-10-11 17:44:51

相关问题