2011-02-12 3 views
3

this post에서 묻는 것처럼 C#에서 다른 프로세스를 호출하는 두 가지 방법이 있습니다.Process.Start 대 C 프로세스에서`p = new Process()`?

Process.Start("hello"); 

그리고

Process p = new Process(); 
p.StartInfo.FileName = "hello.exe"; 
p.Start(); 
p.WaitForExit(); 
  • Q1 : 각 방법의 장점/단점은 무엇입니까?
  • Q2 : Process.Start() 방법에 오류가 있는지 확인하는 방법은 무엇입니까?

답변

6

, 프로세스가 이미 실행중인 경우 메소드가 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

간단한 경우 이점은 주로 편리합니다. 분명히 ProcessStartInfo 경로로 더 많은 옵션 (작업 경로, 셸 exec 등 선택)이 있지만 Process.Start (ProcessStartInfo) 정적 메서드도 있습니다.

오류를 다시 확인하십시오. Process.Start는 Process 개체를 반환하므로 필요한 경우 종료를 기다리고 오류 코드를 확인할 수 있습니다. stderr를 캡처하려면 ProcessStartInfo 접근 방식 중 하나를 원할 것입니다.

+0

당신이 나에게 예를 들어 줄 수있는 최초의 하나는 Process 개체 또는 null를 반환? 객체를 가져와 종료를 기다려야한다면 Process.start()를 사용할 이유가 없어 보인다. – prosseek

+0

@prosseek ok; stdout 및 stderr를 캡처하여 다른 사용자의 계정에서 실행하고 완료 될 때 이벤트를 얻으려고한다고 가정하십시오. 그러나 그렇다. 간단한 경우 정적 메서드가 더 쉽습니다. –

1

거의 차이가 없습니다. 정적 메서드는 프로세스 개체를 반환하므로 여전히 "p.WaitForExit()"등을 사용할 수 있습니다. 새 프로세스를 만드는 메서드를 사용하면 메서드를 시작하기 전에 프로세스 매개 변수 (프로세서 친 화성 등)를 수정하는 것이 더 쉽습니다. 방법.

그 외 - 차이는 없습니다. 새로운 프로세스 객체는 두 가지 방법으로 생성됩니다. 두 번째 예에서

는 - 그이 동일합니다 : 당신이 WaitForExit를 사용하지 못할 수 있습니다 첫 번째 방법으로

Process p = Process.Start("hello.exe"); 
p.WaitForExit(); 
관련 문제