Solution de contournement pour le WaitHandle.WaitAll 64 poignée de limite?

Mon application génère des charges de différentes petites threads via ThreadPool.QueueUserWorkItem qui j'ai garder une trace de la via de multiples ManualResetEvent instances. J'utilise le WaitHandle.WaitAll méthode pour bloquer ma demande de fermeture jusqu'à ce que ces fils ont terminé.

Je n'ai jamais eu de problèmes avant, toutefois, que ma demande est venue en vertu de charge en plus c'est à dire plus de threads en cours de création, je suis maintenant commence à prendre de cette exception:

WaitHandles must be less than or equal to 64 - missing documentation

Quelle est la meilleure solution pour cela?

Extrait de Code

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

Solution

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();
  • Si et quand vous vous déplacez .NET 4 prendre un coup d'oeil à CountdownEvent. Il termine le comptage dans un bon paquet.
InformationsquelleAutor James | 2010-04-23