2012-11-07 4 views
0

here 과 같이 여러 프로세스를 병렬로 실행하려면 ThreadPool을 사용합니다. 일부 매개 변수를 사용하여 자체 프로세스/프로그램을 시작한다는 차이점이 있습니다. 몇 마디로,이 프로그램은 몇 가지 값을 계산하여 텍스트 파일에 기록합니다. 나중에 비교해 보겠습니다.다수의 프로세스 병렬 처리

public void StartProcess() 
{ 
    string par = @"-p ""foo"" -c 17"; 
    Process p = Process.Start(@"C:\MyProgramm.exe", par); 
    p.EnableRaisingEvents = true; 
    p.Exited += new EventHandler(p_Exited); 
} 

void p_Exited(object sender, EventArgs e) 
{    
    // Indicates that the process has been completed 
    this.doneEvent.Set(); 
    Console.WriteLine("thread {0} end...", ThreadIndex); 
} 

소수의 스레드의 경우 잘 동작합니다. 내 경우에는 내가 약 200 스레드를 시작해야하지만, WaitHandle.WaitAll 방법 나는 waitHandles에있는 객체의 수는 시스템 허용하는 것보다 더 큰 NotSuppotedException

를 얻을.

제 질문은 : ThreadPool 클래스가 많은 수의 스레드를 관리 할 가능성이 있습니까? 대기열과 비슷한 것으로, 다른 프로세스가 완료되면 새로운 프로세스가 시작됩니다. 간단한 경우, 내 경우 프로세스 = 스레드.

+1

현대의 컴퓨터 일지라도, 200 개의 프로그램을 동시에 실행하는 것은 parrallel에서 X 프로그램을 실행하는 것보다 시간이 오래 걸릴 것입니다 (X는 논리 프로세서의 수와 같습니다). 당신은 실제로 그것들을 모두 동시에 실행할 필요가 있습니까? TPL을 사용하여 작업을 큐에 대기시킬 수 없습니까? –

+0

물론, 단지 스레드 풀이 가장 효율적인 병렬 작업 수를 관리하기를 원합니다. 불행히도 C# 2.0을 사용하고 TPL을 사용할 수 없습니다. – alex555

답변

0

당신이 당신의 프로세스를 시작하기 전에 올바른 값

this.ProcessesStillRunning = 200; 
this.StartProcesses(200); 
// now wait on your doneEvent 

에 초기화, 하나의 필드

private volatile int ProcessesStillRunning; 

작성이 필드를 감소하기 위해 핸들러를 수정 한 번 과정은

if (System.Threading.Interlocked.Decrement(ref this.ProcessesStillRunning) == 0) 
    this.doneEvent.Set(); 
종료

물론, 이제는 .NET 기본 제공 방식을 사용하지 않아야합니다. 병렬 처리가 제한되며 200 개의 프로세스 만 실행합니다. 그렇다면 OS가이를 어떻게 처리 할 것인가의 문제입니다.