Avrete bisogno di ottenere i dati da un thread all'altro. Questo può essere fatto in un paio di modi ...
In primo luogo, il tuo thread "di sfondo" può aggiornare una specie di variabile di stringa "CurrentStatus" che cambia mentre procede. È quindi possibile inserire un timer nel modulo in modo da acquisire la variabile CurrentStatus e aggiornare l'etichetta con esso.
In secondo luogo, è possibile semplicemente richiamare l'operazione dal thread in background al thread dell'interfaccia utente con un delegato che utilizza la proprietà InvokeRequired del controllo etichetta. Così, per esempio ...
private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
if (this.label1.InvokeRequired)
{
this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
return;
}
this.label1.Text = status;
}
È possibile chiamare che UpdateStatus() il metodo da qualsiasi thread (UI o di fondo), ed è in grado di rilevare se o non ha bisogno di richiamare l'operazione sul thread dell'interfaccia utente principale (e se è così, lo fa).
Per impostare in realtà il filo, è possibile farlo in questo modo:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process() // This is the actual method of the thread
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
UpdateStatus("Processing " + f.Name + "...");
}
}
Poi, quando l'utente fa clic sul pulsante "GO" sarà sufficiente chiamare StartProcessing().
Sono d'accordo con questo, specialmente per BackgroundWorker. Lo uso spesso me stesso.Background I collaboratori rendono le operazioni multi-threading così semplici e facili! – Keithius