2010-04-19 45 views
7

Wir haben das folgende Stück Code (Idee für diesen Code wurde auf dieser Website gefunden), die neue Threads für die Methode "Do_SomeWork()" spawnen wird. Dadurch können wir die Methode mehrmals asynchron ausführen.C# Execute Methode (mit Parametern) mit ThreadPool

Der Code ist:

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

Allerdings würden wir die Verwendung von Threadpool machen möchten, anstatt unsere eigene, neue Themen zu schaffen, die die Leistung beeinträchtigen können. Die Frage ist, wie wir den obigen Code ändern können, um ThreadPool zu verwenden, wobei wir berücksichtigen, dass die Methode "Do_SomeWork" mehrere Parameter verwendet und auch einen Rückgabetyp hat (d. H. Methode ist nicht void).

Auch dies ist C# 2.0.

Antwort

8

So ziemlich die gleichen Art und Weise hat, verwenden, aber ein WaitCallback zu ThreadPool.QueueUserWorkItem geben:

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

Ich denke nur, wenn seine wirklich so cool Ihre Methoden auf den Rückruf während vorbei null Objekte/tasksInfo laufen – electricalbah

1

Mit C# 2.0, rufen Sie

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

dann innerhalb der Callback Sie das Objekt geworfen [] wieder in die richtigen Parameter und Typen. In Bezug auf den Rückgabetyp, wenn den Threadpool verwendet Ich glaube nicht, Sie in der Lage sein werden, den Rückgabewert zu erhalten, muss der Rückruf eine Signatur von

void Callback (object parm)