Penso che ci sia un modo diverso e migliore per avvicinarsi a questo. (Perdonami se accidentalmente Java-ize alcuni della sintassi)
Il thread principale qui ha un elenco di cose da fare in "Attività" - invece di creare thread per ogni attività, che non è davvero efficiente quando si avere così tanti articoli, creare il numero desiderato di thread e poi chiedere loro di richiedere le attività dall'elenco secondo necessità.
La prima cosa da fare è aggiungere una variabile alla classe da cui proviene questo codice, da usare come puntatore nella lista. Aggiungeremo anche uno per il numero massimo di thread desiderato.
// New variable in your class definition
private int taskStackPointer;
private final static int MAX_THREADS = 5;
Creare un metodo che restituisce l'attività successiva nell'elenco e incrementa il puntatore dello stack. Quindi creare una nuova interfaccia per questo:
// 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;
}
In alternativa, si potrebbe tornare compiti [taskStackPointer ++] il codice, se c'è un valore che si può designare come che significa "fine della lista".. Probabilmente è più facile farlo in questo modo, comunque.
L'interfaccia:
public interface TaskDispatcher
{
[MethodImpl(MethodImplOptions.Synchronized)] public task getNextTask();
}
All'interno della classe ReportGenerator, modificare il costruttore ad accettare l'oggetto dispatcher:
public ReportGenerator(TaskDispatcher td, int idCode)
{
...
}
Avrete anche bisogno di modificare il ReportGenerator classe in modo che il l'elaborazione ha un ciclo esterno che inizia chiamando td.getNextTask() per richiedere una nuova attività e quale esce dal ciclo quando viene restituito un valore NULL.
Infine, modificare il codice di creazione thread per qualcosa di simile: (questo è solo per dare un'idea)
taskStackPointer = 0;
for (int i = 0; i < MAX_THREADS; i++)
{
ReportGenerator worker = new ReportGenerator(this,id);
worker.Go();
}
In questo modo si crea il numero desiderato di fili e tenerli tutti a lavorare a capacità massima .
(Non sono sicuro di aver utilizzato "[MethodImpl (MethodImplOptions.Synchronized)]" esattamente corretto ...Sono più abituati a Java che C#)
Hai verificato il valore di ** tasks.Count ** nel debugger? Hai provato a inserire semplicemente "5"? –
L'array di compiti ha ~ 8000 oggetti in esso – Mike