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();

Antworten auf die Frage(16)

Ihre Antwort auf die Frage