2009-08-06 127 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

相關問題