Per lanciare uno thread come backgroundworker using System.Threading; using System.ComponentModel; 1) nel form designer, aggiungere il backGroundWorker fa i controlli 2) nel form.design.cs, aggiungere di netto una cosa del tipo // // bgWorkerMuovi // this.bgWorkerMuovi.WorkerReportsProgress = true; this.bgWorkerMuovi.WorkerSupportsCancellation = true; this.bgWorkerMuovi.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgWorkerMuovi_DoWork); this.bgWorkerMuovi.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgWorkerMuovi_ProgressChanged); this.bgWorkerMuovi.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bgWorkerMuovi_RunWorkerCompleted); 3) nel form.cs aggiungere la chiamata e i tre delegati, es chiamata: private void btnStart_Click(object sender, EventArgs e) { int arg = = Convert.ToInt32(cbVel.SelectedItem); try { bgWorkerMuovi.RunWorkerAsync(arg); Trace.WriteLine("Inizio ..."); } catch(Exception ex) { MessageBox.Show("[BGMuovi] "+ex.Message); } } fermata: private void btnStop_Click(object sender, EventArgs e) { bgWorkerMuovi.CancelAsync(); statusStripLabel.Text = "Task cancellato"; } delegati: private void bgWorkerMuovi_DoWork(object sender, DoWorkEventArgs e) { int arg; BackgroundWorker worker = sender as BackgroundWorker; arg = (int) e.Argument; GeneraPunto GP = new GeneraPunto(worker,context,e); GP.Genera(arg); } private void bgWorkerMuovi_ProgressChanged(object sender, ProgressChangedEventArgs e) { //progressBar1.Value = e.ProgressPercentage; statusStripLabel.Text = (string)e.UserState; // // fire an event in this class to notify other classes // } private void bgWorkerMuovi_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { string msg; if (e.Cancelled) // The user canceled the operation. msg = String.Format("Operazione annullata dall'utente"); else if (e.Error != null) // There was an error during the operation. msg = String.Format("Errore: {0}", e.Error.Message); else // The operation completed normally. { msg = String.Format("Risultato = {0}", e.Result); } statusStripLabel.Text = msg; MessageBox.Show(msg); } Nel codice da lanciare: class GeneraPunto { public BackgroundWorker BGworker; private SynchronizationContext context; private DoWorkEventArgs e; // Costruttore public GeneraPunto(BackgroundWorker worker, SynchronizationContext ctxt, DoWorkEventArgs ea) { BGworker = worker; context = ctxt; e = ea; } in qualunque funzione e.Result = "Fatto tutto"; //report progress if(qualche condizione) BGworker.ReportProgress((int)((100.0 / SD.numCol) * idRoute),"Sto costruendo"); // If operation canceled by the user, set DoWorkEventArgs.Cancel property to true. if (BGworker.CancellationPending) { e.Cancel = true; return; }