2011-02-12 48 views
3

如在this post中所述,有兩種方法可以在C#中調用另一個進程。Process.Start vs在C#中處理`p = new Process()`?

Process.Start("hello"); 

而且

Process p = new Process(); 
p.StartInfo.FileName = "hello.exe"; 
p.Start(); 
p.WaitForExit(); 
  • Q1:什麼是每一種方法的優點/缺點?
  • 問題2:如何檢查Process.Start()方法是否發生錯誤?

回答

6

隨着你可能無法使用WaitForExit第一種方法,因爲該方法,如果進程已經運行返回null。

你如何檢查是否有新的進程啓動的方法是不同的。第一個返回Process對象或null

Process p = Process.Start("hello"); 
if (p != null) { 
    // A new process was started 
    // Here it's possible to wait for it to end: 
    p.WaitForExit(); 
} else { 
    // The process was already running 
} 

第二個返回bool

Process p = new Process(); 
p.StartInfo.FileName = "hello.exe"; 
bool s = p.Start(); 
if (s) { 
    // A new process was started 
} else { 
    // The process was already running 
} 
p.WaitForExit(); 
6

對於簡單的情況下,其優點主要是方便。顯然你有更多的選擇(工作路徑,在shell-exec之間進行選擇等)與ProcessStartInfo路由,但也有一個Process.Start(ProcessStartInfo)靜態方法。

重新檢查錯誤; Process.Start返回Process對象,因此您可以等待退出並檢查錯誤代碼(如果需要)。如果你想捕獲stderr,你可能需要任何一種ProcessStartInfo方法。

+0

你能不能舉個例子?如果必須獲得對象並等待退出,那麼在我看來,由於簡單性,沒有理由使用Process.start()。 – prosseek 2011-02-12 10:38:31

1

差別很小。靜態方法返回一個進程對象,所以你仍然可以使用「p.WaitForExit()」等 - 使用創建新進程的方法,在啓動之前修改進程參數(處理器相關性等)會更容易處理。

除此之外 - 沒有區別。一個新的過程對象是以兩種方式創建的。

在你的第二個例子 - 這是相同的:

Process p = Process.Start("hello.exe"); 
p.WaitForExit();