2010-04-19 7 views
7

Nous avons le code suivant (l'idée pour ce code a été trouvée sur ce site) qui engendrera de nouveaux threads pour la méthode "Do_SomeWork()". Cela nous permet d'exécuter la méthode plusieurs fois de manière asynchrone.C# Exécuter la méthode (avec les paramètres) avec ThreadPool

Le code est:

var numThreads = 20; 
    var toProcess = numThreads; 

    var resetEvent = new ManualResetEvent(false); 

    for (var i = 0; i < numThreads; i++) 
    { 
     new Thread(delegate() 
     { 
      Do_SomeWork(Parameter1, Parameter2, Parameter3); 
      if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
     }).Start(); 
    } 

    resetEvent.WaitOne(); 

nous aimerions toutefois utiliser ThreadPool plutôt que de créer nos propres nouveaux fils qui peuvent nuire à la performance. La question est comment pouvons-nous modifier le code ci-dessus pour utiliser ThreadPool en gardant à l'esprit que la méthode "Do_SomeWork" prend plusieurs paramètres et a également un type de retour (c'est-à-dire que la méthode n'est pas vide).

En outre, ceci est C# 2.0.

Répondre

8

À peu près de la même façon , mais utiliser un WaitCallback passé à ThreadPool.QueueUserWorkItem:

var numThreads = 20; 
var toProcess = numThreads; 

var resetEvent = new ManualResetEvent(false); 

for (var i = 0; i < numThreads; i++) 
{ 
    ThreadPool.QueueUserWorkItem (
     new WaitCallback(delegate(object state) { 
     Do_SomeWork(Parameter1, Parameter2, Parameter3); 
     if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
    }), null); 
} 

resetEvent.WaitOne(); 
+0

Il suffit de penser si son vraiment cool pour exécuter vos méthodes sur le rappel tout en passant des objets null/tasksInfo – electricalbah

1

Avec C# 2.0, vous appelez

ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc }); 

Puis dans le rappel que vous lancez l'objet [] de nouveau dans les paramètres et les types corrects. En ce qui concerne le type de retour, si vous utilisez la ThreadPool Je ne pense pas que vous serez en mesure d'obtenir la valeur de retour, le rappel doit avoir une signature de

void Callback (object parm)

Questions connexes