2010-04-19 19 views
7

Mamy następujący fragment kodu (pomysł na ten kod został znaleziony na tej stronie), który odrodzi nowe wątki dla metody "Do_SomeWork()". Dzięki temu możemy wielokrotnie uruchamiać tę metodę asynchronicznie.C# Metoda wykonywania (z parametrami) z ThreadPool

Kod jest:

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

jednak chcielibyśmy skorzystać z puli wątków zamiast tworzyć własne nowe wątki, które mogą być szkodliwe dla wydajności. Pytanie brzmi, w jaki sposób możemy zmodyfikować powyższy kod, aby skorzystać z ThreadPool, pamiętając, że metoda "Do_SomeWork" przyjmuje wiele parametrów, a także ma typ zwracany (tj. Metoda nie jest nieważna).

Ponadto jest to C# 2.0.

Odpowiedz

8

Prawie tak samo , ale użyć WaitCallback przekazane 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

samą myśl, że jeśli jej naprawdę fajne uruchomić swoje metody na wywołanie zwrotne podczas mijania pustych obiektów/tasksInfo – electricalbah

1

z C# 2.0, zadzwonić

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

Następnie wewnątrz zwrotnego rzucisz obiekt [] Powrót do odpowiednich parametrów i typów. Jeśli chodzi o typ zwracany, jeśli przy użyciu puli wątków Nie sądzę, będzie można uzyskać wartość zamian zwrotna musi mieć podpis

void Callback (object parm)