creo que hay una manera diferente y mejor acercarse a este. (Perdóneme si accidentalmente Java -ize algo de la sintaxis)
El hilo principal aquí tiene una lista de cosas que hacer en "Tareas" - en lugar de crear subprocesos para cada tarea, lo cual no es realmente eficiente cuando tener tantos elementos, crear la cantidad deseada de hilos y luego pedirles que soliciten tareas de la lista según sea necesario.
Lo primero que debe hacer es agregar una variable a la clase de la que proviene este código, para usar como un puntero en la lista. También agregaremos uno para el conteo máximo de hilos deseado.
// New variable in your class definition
private int taskStackPointer;
private final static int MAX_THREADS = 5;
Cree un método que devuelva la siguiente tarea en la lista e incremente el puntero de la pila. A continuación, crear una nueva interfaz para esto:
// Make sure that only one thread has access at a time
[MethodImpl(MethodImplOptions.Synchronized)]
public task getNextTask()
{
if(taskStackPointer < tasks.Count)
return tasks[taskStackPointer++];
else
return null;
}
Alternativamente, usted podría volver tareas [taskStackPointer ++] código, si hay un valor que puede designar en el sentido de "final de la lista".. Sin embargo, probablemente sea más fácil hacerlo de esta manera.
La interfaz:
public interface TaskDispatcher
{
[MethodImpl(MethodImplOptions.Synchronized)] public task getNextTask();
}
Dentro de la clase ReportGenerator, cambiar el constructor para aceptar el objeto despachador:
public ReportGenerator(TaskDispatcher td, int idCode)
{
...
}
También debes alterar el ReportGenerator clase para que la el procesamiento tiene un bucle externo que comienza llamando al td.getNextTask() para solicitar una nueva tarea, y que sale del bucle cuando devuelve un NULL.
Por último, modificar el código de la creación del hilo a algo como esto: (esto es sólo para darle una idea)
taskStackPointer = 0;
for (int i = 0; i < MAX_THREADS; i++)
{
ReportGenerator worker = new ReportGenerator(this,id);
worker.Go();
}
De esta manera se crea el número deseado de hilos y mantenerlos todo funcione a su capacidad máxima .
(No estoy seguro de que tenga el uso de "[MethodImpl (MethodImplOptions.Synchronized)]" exactamente correcto ...Estoy más acostumbrado a Java a C#)
Has verificado el valor de ** tasks.Count ** en el depurador? ¿Has intentado simplemente poner "5" en su lugar? –
La matriz de tareas tiene ~ 8000 objetos en ella – Mike