2011-05-02 17 views
10

可能重複:
What happens if I don't close a System.Diagnostics.Process in my C# console app?使用過程中使用塊

由於System.Diagnostics.Process繼承Component它實現IDisposable,我就應該總是創建一個usingProcess

例如,這...:

using (var process = new Process()) 
{ 
    process.StartInfo.FileName = "some process.exe"; 
    process.Start(); 
    process.WaitForExit(); 
} 

...而不是這樣的:

var process = new Process 
    { 
     StartInfo = { FileName = "some process.exe" } 
    }; 
process.Start(); 
process.WaitForExit(); 

我問,因爲我已經很少見到Process出現在using塊;例如MSDN pageProcess不使用它。使用對象初始值設定項也有幫助。

如果我應該正在使用它,那麼我應該去「改造」它到我現有的代碼庫嗎?

如果沒有完成,會有什麼後果? (假設在每種情況下都正確調用WaitForExit())。

+1

謝謝 - 沒有看到這個問題。我同意它是相似的,但我具體詢問Dispose()而不是Close()。 – 2011-05-02 14:02:08

+0

但是接受的答案比這裏的其他任何更好......:P – rsenna 2011-05-02 14:18:28

+0

「使用對象初始值設定項也有幫助。」即使使用'using'塊,您仍然可以使用對象初始值設定項。我知道這個問題已經很老了,但是我用.NET 2.0測試了這個問題,並且至少在很久以前它就可以正常工作。 – 2016-08-28 16:11:57

回答

5

如果您不能或不能使用using(),則應確保在不再需要時處理該變量。

如果您在使用過程變量的一類(而不是程序或方法),那麼這個類應該實現IDisposable,然後調用_process.Dispose在它的Dispose(布爾)方法:

void Dispose(bool disposing) 
{ 
    ... 
    if (_process != null) 
    { 
     Dispose(_process); 
    } 
} 

如果沒有_process字段但只有您在方法中使用的過程變量,則必須在方法內處理該變量:

void MyMethod() 
{ 
    var process = ... 
    ... use it here ... 
    process.Dispose(); 
} 
+1

這是一般規則,但OP會詢問有關'System.Diagnostics.Process'的特定信息。 – rsenna 2011-05-02 13:53:56

+0

我也說過,也適用於Process的情況。 – 2011-05-02 13:58:58

+0

@rsenna - 然而,你明白這個規則可以幫助那些不知道爲什麼在這種情況下使用()的人。 – 2011-05-02 14:04:22

4

MSDN示例是人爲設計的。打開進程句柄的程序在啓動進程後立即退出。當程序退出時,它打開的任何句柄都會關閉。

如果你打開一個進程句柄,你應該關閉它。 Component.Dispose的Process.Dispose覆蓋只是簡單地調用Process.Close。使用語句簡化了這一點。