2011-02-12 102 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();