Avevo fatto questo in precedenza, ma mi è sfuggita di mano la gestione dei Thread.
codice:
private void Start()
{
Computer oComputer;
int iLoop = 0;
int iMaxLoop = 10;
//Elenco PC - ( ..potrebbero variare di numero... )
ArrayList aComputerList = new ArrayList();
aComputerList.Add(new Computer("192.168.1.5", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
aComputerList.Add(new Computer("192.168.1.10", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
aComputerList.Add(new Computer("192.168.1.15", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
aComputerList.Add(new Computer("192.168.1.20", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
aComputerList.Add(new Computer("192.168.1.25", "D:\\Backup\\Backup_2012_04_12\\", "myFile.txt"));
//Creoo un Loop che non termina mai fino al raggiungimento di "iMaxLoop".
for (int i = 0; i < aComputerList.Count; i++)
{
//Esco dal Loop
if (iLoop >= iMaxLoop)
{
MessageBox.Show("Fine Loop!");
return;
}
//Assegno l'istanza da utilizzare nel Loop corrente
oComputer = (Computer)aComputerList[i];
//Di Default lo Stato è "Libero", cioè questa istanza non è impegnata con la Ricerca
if (oComputer.Status == false)
{
oComputer.Status = true; //Imposto lo stato di ricerca a "Occupato", cioè stà cercando
t = new Thread(new ParameterizedThreadStart(Cerca));
t.Start(oComputer);
}
//Se i Computer sono finiti, riparto dal primo
if (i == (aComputerList.Count - 1))
{
i = -1;
}
}
}
public void Cerca(object _oComputer)
{
if (_oComputer != null)
{
//Ricerca------
// --- code ---
//Appena ho il risultato cercato lo passo al metodo "Result"
((Computer)_oComputer).Result = "il-mio-risultato";
Thread.Sleep(60000);
//Imposto lo stato di ricerca a "Libero", cosi
((Computer)_oComputer).Status = false;
}
}
La dinamica dovrebbe essere la seguente:
1) parte il Loop dei Computer e quindi si avviano contemporaneamente 5 ricerche.
"ogni Computer ha più o meno file da scansionare, quindi i tempi sono diversi"
2) appena un processo tra i 5 avviati finisce, deve passare il risultato a "Start()" e non deve ripartire prima 1ora.
Questi due passaggi si ripetono per 8 volte.