Мое приложение порождает множество небольших рабочих потоков через ThreadPool.QueueUserWorkItem
, которые я отслеживаю через несколько экземпляров ManualResetEvent
. Я использую метод WaitHandle.WaitAll
, чтобы заблокировать мое приложение от закрытия до тех пор, пока эти потоки не будут завершены.
У меня никогда не было никаких проблем, прежде чем, поскольку мое приложение загружается с большей нагрузкой, то есть больше создаваемых потоков, теперь я начинаю получать это исключение:
WaitHandles must be less than or equal to 64 - missing documentation
Какое лучшее альтернативное решение?
Фрагмент кода
List<AutoResetEvent> events = new List<AutoResetEvent>();
// multiple instances of...
var evt = new AutoResetEvent(false);
events.Add(evt);
ThreadPool.QueueUserWorkItem(delegate
{
// do work
evt.Set();
});
...
WaitHandle.WaitAll(events.ToArray());
Обходной путь
int threadCount = 0;
ManualResetEvent finished = new ManualResetEvent(false);
...
Interlocked.Increment(ref threadCount);
ThreadPool.QueueUserWorkItem(delegate
{
try
{
// do work
}
finally
{
if (Interlocked.Decrement(ref threadCount) == 0)
{
finished.Set();
}
}
});
...
finished.WaitOne();