2012-11-07 6 views
0

Я использую ThreadPool для выполнения нескольких процессов параллельно, как показано here с той разницей, что я запускаю свой собственный процесс/программу с некоторыми параметрами. В нескольких словах эта программа вычисляет некоторые значения и записывает их в текстовый файл, который я потом сравниваю.Параллельная обработка большого количества процессов

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 методе я получаю NotSuppotedException

Количество объектов в waitHandles больше, чем система разрешений.

Мой вопрос сейчас: есть ли возможность ThreadPool класса для управления большим количеством потоков? Что-то вроде очереди, начиная новые процессы, когда другие были завершены. Чтобы быть простым, в моем случае процесс = поток.

+1

Даже современный компьютер, работающий на 200 программах одновременно, займет больше времени, чем запуск программы X в параболическом (X равно числу логических процессоров). Вам действительно нужно запускать их все одновременно? Не можете ли вы просто использовать TPL для очереди работы? –

+0

Конечно, нет, я хочу, чтобы пул потоков управлял самым эффективным числом параллельных заданий. К сожалению, я использую C# 2.0 и не могу использовать TPL – alex555

ответ

0

Создать одно поле

private volatile int ProcessesStillRunning; 

Перед тем, как начать свои процессы, инициализировать его правильное значение

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

Измените обработчик для уменьшения этого поля, когда процесс выходит

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

Конечно, вы должны теперь, чтобы ваш подход не использовал какой-либо встроенный .NET параллелизма и будет запускать только 200 процессов. Тогда речь идет о том, как ОС справится с этим.

Смежные вопросы