Workaround für das WaitHandle.WaitAll 64-Handle-Limit?
Meine Anwendung erzeugt über @ eine Menge verschiedener kleiner Worker-ThreadThreadPool.QueueUserWorkItem
was ich über mehrere verfolgenManualResetEvent
Instanzen. Ich verwende dasWaitHandle.WaitAll
-Methode, um zu verhindern, dass meine Anwendung geschlossen wird, bis diese Threads abgeschlossen sind.
Ich hatte noch nie zuvor Probleme, da meine Anwendung immer stärker ausgelastet ist, d. H., Dass immer mehr Threads erstellt werden, tritt nun die folgende Ausnahme auf:
WaitHandles must be less than or equal to 64 - missing documentation
Was ist die beste Alternative dazu?
Code-Auszu
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());
Workaround
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();