2013-02-08 3 views
3

Process.Start을 다른 실행 파일 (파일 형식 아님)을 쉘링하는 동안 왜 예외를 throw하지 않고 false를 반환하고 실행을 시작하지 않습니까? 더 명확히하기 위해, 문서는 프로세스 자원이 시작되면 true를 반환하고, 기존 프로세스가 다시 사용되는 경우처럼 새 프로세스 자원이 시작되지 않으면 false로 반환합니다. "기존 프로세스가 재사용 됨"에 대한 모든 설명은 기존 이미지 편집기 인스턴스에서 열리는 .jpg 시작과 같이이를 처리하는 프로그램의 기존 인스턴스에서 열리는 파일을 실행하는 것으로 보입니다. 이 컨텍스트에서 실행되는 실행 파일은 사내에서 작성되며 새 인스턴스가 실행되지 못하도록 막지 않습니다. 로깅 또는 응용 프로그램이 시작하려고 시도한 다른 표시가 없습니다. 프로세스가 시작되지 않은 이유에 대한 피드백은 어디에도 없습니다.Process.Start가 갑자기 false를 반환하는 이유

신속한 연속 실행으로 실행되는 실행 파일 수가 많을수록 문제가 재현성이 높아집니다. 프로덕션 환경에서 동일한 코드가 실패하지는 않지만 여러 시스템에서로드가 더 잘 분산됩니다. 테스트 환경에서 100 개 이상의 프로세스가 단일 시스템에서 빠른 연속적으로 시작되고 꽤 일관되게 마지막 7-10이 실행에 실패한 유일한 프로세스입니다. 제어 프로세스는 시작될 때 이미 실행중인 프로세스를 감지하고 현재 실행되지 않는 프로세스 만 시작할 것입니다. 이것은 올바르게 작동하는 것처럼 보입니다. 완전히 새로 시작하면 (100 개 이상의 인스턴스가 모두 중지 된 것으로 확인한 다음 시작합니다) 7 또는 시작하지 못하고 시작했지만 제어 프로세스와 같은 실행 파일을 다시 시작할 수 있습니다. 동일한 설정이 성공적으로 실행됩니다. 시작된 모든 프로세스가 서로 다른 명령 행 인수로 실행 가능하다는 것을 아는 것이 유용 할 수 있습니다. 제어 프로세스는 Windows 서비스이며 생성 된 실행 파일은 표준 입력 또는 출력 스트림에 종속되지 않는 명령 줄 응용 프로그램입니다.

이 문제를 해결하는 과정에서 안전을 위해 외부 응용 프로그램을 시작하는 스레드가 단일 스레드 아파트에서 실행되고 있는지 확인했습니다. ShellExecuteEx는 이에 의존 할 수 있기 때문에 프레임 워크가이를 고려해야한다고 생각하기 때문입니다. Thread.Sleep 지연을 추가하지 않으려 고 시도해 보았습니다. 실행되지 않는 응용 프로그램의 양에 영향을 미치지 않는 것으로 나타났습니다 (다양한 지연이 100ms에서 300ms로 시도되었고 가장 최근에는 각 인스턴스가 최대 1500ms까지 올라간 후에 증가하는 지연이있었습니다).).

아마도 창에 의해 부과 된 자식 프로세스의 최대 수 또는 Windows가 동시에 수많은 프로세스를 시작하려고 할 때 발생하는 버그일까요? 나는 에 대한 합리적인 대답을 찾을 수 없었습니다. 왜 실행이 실패합니다. 다음은 실행 자체 실행 비트이다 (편집 됨 일부 내부는 있지만, 모든 프레임 워크 코드 그대로) :

 if (!Path.IsPathRooted(processPath)) 
     { 
      processPath = Path.GetFullPath(Path.Combine(
       Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), 
       processPath)); 
     } 

     ProcessStartInfo psi = 
       new ProcessStartInfo(processPath, args); 
     psi.UseShellExecute = true; 
     psi.CreateNoWindow = true; 

     Trace("Starting {0} {1}", processPath, args); 

     using (Process process = new Process()) 
     { 
      process.StartInfo = psi; 
      bool success = process.Start(); 
      if (!success) 
      { 
       // this is what doesn't make sense 
      } 
     } 

     Trace("Started {0} {1}", processPath, args); 
+0

그것은 * 어떤 * 프로세스 나 일부 특정 일을 시작하지인가 : 다음

var errorCode = Marshal.GetLastWin32Error(); 

, 당신은 Win32 오류를 얻을 것이다 가정이 사이트를 찾아 ? –

+0

@MiserableVariable - "테스트 환경에서 100+ 프로세스는 단일 시스템에서 빠르게 연속적으로 시작되며 거의 일관되게 마지막 7-10 만 실행에 실패합니다." – JDB

+0

죄송 합니다만 이전에는 읽지 않았습니다. 다시 시도합니까? –

답변

관련 문제