现在我正在生成 3 个线程来做一些并发工作,我使用 Threadpooling 设置它,因为我希望所有线程同时运行,但在继续之前让所有线程完成。这是代码的要点:
_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 种方法,只是为了 set() 正确的线程。
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();
}
显然它不是很干,因为我希望有 4 个或 5 个线程,但要确保 Set() 在完成时设置正确的 _resetEvent。
关于如何安全地做到这一点并使其更加干燥和可扩展的任何建议?