Eseguire metodi in threads secondari è ormai un pratica "comune" per chi sviluppa applicazioni Window Forms.
A parte i soliti 'problemi' di sincronizzazione tipici delle applicazioni multithread la parte più 'ostica' è l'accesso ai controlli Windows Forms in maniera thread safe, operazione che ci costringe ad utilizzare Delegates,Invoke, InvokeRequired...
Per renderci la vita più "facile" in Whidbey è stato aggiunto un controllo BackGroundWorkerThread il quale ha un metodo RunWorkerAsync che invocato prova la generazione (in un thread secondario) di un evento DoWork (al quale, volendo, possiamo anche passare dei parametri).
All'interno di DoWork() è possibile invocare il metodo ReportProcess che a sua volta invoca l'evento ProgressChanged (nel main thread) che possiamo utilizzare per dare un feedback sullo stato dell'operazione asincrona.
L'evento RunWorkerCompleted viene generato non appena terminata l'esecuzione asincrona di DoWork().
Il codice riportato mostra come eseguire un metodo in maniera asincrona e visualizzarne il progress in una progressbar.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){
DateTime now = DateTime.Now;
while (DateTime.Now < now.AddSeconds(10))
{
TimeSpan ts = (DateTime.Now - now);
backgroundWorker1.ReportProgress(ts.Seconds*10);
}
}
private void button1_Click(object sender, EventArgs e)
{backgroundWorker1.RunWorkerAsync();}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{progressBar1.Value = 0;}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){
progressBar1.Value = e.ProgressPercentage;
progressBar1.Refresh();
}
Nella versione 2.0 del framework se accedete ad un controllo in maniera no thread-safe il framework vi mostra (finalmente) un warning.
Bello il colore viola vero?... :-)