Прямо сейчас я создаю 3 потока для выполнения некоторой параллельной работы, я настроил его с помощью Threadpooling, так как я хочу, чтобы все потоки выполнялись одновременно, но все потоки завершались прежде чем продолжить. Вот суть кода:Предложение сделать мой threadpool setup безопасным, сухим и масштабируемым
_resetEvents = new ManualResetEvent[3];
_resetEvents[0] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkA);
_resetEvents[1] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkB);
_resetEvents[2] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(DoWorkC);
WaitHandle.WaitAll(_resetEvents);
Но мои методы все используют один и тот же базовый код, я разбил его на 3-х методов только установить() правую резьбу.
private void DoWorkA(object o) {
var workerClass = new WorkerClass();
workerClass.Process();
_resetEvents[0].Set();
}
private void DoWorkB(object o) {
var workerClass = new WorkerClass();
workerClass.Process();
_resetEvents[1].Set();
}
private void DoWorkC(object o) {
var workerClass = new WorkerClass();
workerClass.Process();
_resetEvents[2].Set();
}
Очевидно, что это не очень DRY, так как я хотел бы иметь 4 или, может быть, 5 нитей, но хотите, чтобы убедиться, что Set() устанавливает правильную _resetEvent, когда он будет завершен.
Любые предложения о том, как я могу безопасно сделать это и сделать его более сухим и масштабируемым?
Лучший подход Parallel.Invoke(), но это Fx 4 и выше. –