2013-05-09 3 views
0

프로세스를 여러 번 실행해야합니다. 매번 ProcessProcessStartInfo의 개체를 구현하는 정적 메서드를 호출합니다. ProcessStartInfo 속성이 오류 또는 출력을 반환하도록 수정되었습니다. 내부 정적 메서드를 호출 할 수 있습니까 Parallel.For 루프? 이 스레드 안전에 관한 문서를 찾을 수 없습니다. 이 아니라 동일한 프로세스 내에서을 스레드를 분리 프로세스 별도의 경우스레드 안전 다중 프로세스

public static void Run(string item1, string item2, string item3, string item4) 
{ 
     var ProcInfo = new ProcessStartInfo(Program.exe,(item1+item2+item3+item4)); 
     ProcInfo.CreateNoWindow = true; 
     ProcInfo.UseShellExecute = false; 
     ProcInfo.WorkingDirectory = Environment.CurrentDirectory; 

     ProcInfo.RedirectStandardError = true; 

     var process = Process.Start(ProcInfo); 
     process.WaitForExit(); 

     string error = process.StandardError.ReadToEnd(); 
     int exitCode = process.ExitCode; 

      Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error)); 
      Console.WriteLine("ExitCode: " + exitCode, "ExecuteCommand"); 
      process.Dispose(); 
} 
+0

해당 코드를 추가하십시오. – nmat

+0

코드를 게시하십시오. 귀하의 전화를 멈추게하는 것은 거의 없습니다 (합리적인 것이 든 다른 것이 든간에). 그러나 코드를 보지 않고는 확신 할 수 없습니다. –

+0

'ProcessInfo' 클래스 란 무엇입니까? 'System.Diagnostics'에는 그런 것이 없습니다. 학급의 문서를보십시오. (예 : http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx). 맨 아래의 "스레드 안전성"에서 "이 형식의 모든 공용 정적 (Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다." –

답변

1

, 당신은 mutex를 사용하여보고해야한다.

+0

OP 질문에 답을 볼 수 없습니다. – Marco

+0

@Marco 질문 *이 교차 프로세스 동기화와 관련되어 나타납니다. OP가 업데이트하고 명확하게 * 답을 구체화 할 수 있는지 묻는다면, 내 대답은 자신보다 중요하지 않습니다. – James

+0

공정한만큼, OP가 말한 것을 볼 수 있습니다. – Marco

0

정적 잠금 개체를 만들거나 (한 가지 방법 만 사용할 수 있도록 유형을 잠그기) lock() 메커니즘을 사용하면됩니다. 스레드를 안전하게 유지하는 것은 TPL이 아닌 구현에 따라 달라집니다.

2

모두 부작용에 따라 다릅니다. 문자열 객체 만 전달하기 때문에 응용 프로그램에서는 스레드로부터 안전하므로 아무 것도 반환하지 않습니다. 문자열은 불변이고 정적 공유 멤버 변수를 사용하지 않으므로이 코드는 독립적으로 실행됩니다.

유일한 문제는 콘솔에 쓰는 것입니다. Console.WriteLine은 그 자체로 스레드 안전 에 하나의 스레드 만 stdout에 한 번에 쓸 수 있습니다. 애플리케이션의 출력이 섞여 살아 간다면 이미 완료된 것입니다.

응용 프로그램 내부의 스레딩 부분입니다. 그러나 호출 된 프로세스에 동시성이 발생합니다. 시작된 응용 프로그램 (예 : 항상 % TEMP %에 xxx.tmp라는 파일을 작성하면 호출 된 실행 파일이 동시에 시작되어 사용중인 파일 오류를 일으키기 때문에 발생하는 경쟁 조건이 있습니다. 호출 된 실행 파일이 동시에 안전하게 호출 될 수 있다고 확신 할 때 코드가 스레드 안전하다고 말하면 원하는만큼 많은 스레드를 호출 할 수 있습니다.