2010-04-19 14 views
7

Tenemos el siguiente fragmento de código (la idea para este código se encontró en este sitio web) que engendrará nuevos hilos para el método "Do_SomeWork()". Esto nos permite ejecutar el método varias veces de forma asíncrona.Método de ejecución C# (con parámetros) con ThreadPool

El código es:

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

Sin embargo nos gustaría hacer uso de ThreadPool en lugar de crear nuestros propios nuevos temas que pueden ser perjudiciales para el rendimiento. La pregunta es cómo podemos modificar el código anterior para hacer uso de ThreadPool teniendo en cuenta que el método "Do_SomeWork" toma múltiples parámetros y también tiene un tipo de devolución (es decir, el método no es nulo).

Además, esto es C# 2.0.

Respuesta

8

Más o menos de la misma manera , pero el uso de un WaitCallback pasó a 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

Sólo de pensar si es realmente tan fresco para ejecutar sus métodos en la devolución de llamada transferencia de objetos nulos/tasksInfo mientras – electricalbah

1

con C# 2.0, se llaman

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

A continuación, dentro de la devolución de llamada que convertir el objeto [] nuevamente dentro de los parámetros y tipos correctos. En cuanto al tipo de retorno, si se utiliza el ThreadPool No creo que usted será capaz de obtener el valor de retorno, la devolución de llamada tiene que tener una firma de

void Callback (object parm)

Cuestiones relacionadas