Come usare un BackgroundWorker?

So che ha 3 metodi. Nel mio programma ho un metodo per inviare un messaggio. Spesso è tardi e il programma a volte non invia affatto il messaggio in risposta a una pressione di un pulsante. A volte è in ritardo di 5 secondi da quello che mi aspetterei e il programma si blocca. Voglio utilizzare un BackgroundWorker per inviare il messaggio come previsto e consentire al programma di funzionare normalmente in ogni momento. Ho avuto il codice per l’invio del messaggio in un gestore di pulsanti. Ora dove metto questo codice equivalente? Vorrei che tutto questo fosse gestito da un pulsante.

È questo il gestore appropriato?

 backgroundWorker1.RunWorkerAsync(); 

e in:

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {} 

Inserirò il mio codice nel gestore di pulsanti? E questo prima:

 carga.progressBar1.Minimum = 0; carga.progressBar1.Maximum = 100; 

Carga è la mia altra forma in cui è presente ProgressBar. Come utilizzo un BackgroundWorker in questo scenario?

È ansible aggiornare la barra di avanzamento solo dai gestori di eventi ProgressChanged o RunWorkerCompleted poiché questi sono sincronizzati con il thread dell’interfaccia utente.

L’idea di base è. Thread.Sleep simula solo del lavoro qui. Sostituiscilo con la tua vera chiamata di routing.

 public Form1() { InitializeComponent(); backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; backgroundWorker1.WorkerReportsProgress = true; } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { Thread.Sleep(1000); backgroundWorker1.ReportProgress(i); } } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } 

So che questo è un po ‘vecchio, ma nel caso in cui un altro principiante sta passando questo, condividerò un po’ di codice che copre un po ‘più delle operazioni di base, ecco un altro esempio che include anche l’opzione per annullare il processo e anche segnalare all’utente lo stato del processo. Aggiungerò il codice fornito da Alex Aza nella soluzione sopra riportata

 public Form1() { InitializeComponent(); backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; //Tell the user how the process went backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; //Allow for the process to be cancelled } //Start Process private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } //Cancel Process private void button2_Click(object sender, EventArgs e) { //Check if background worker is doing anything and send a cancellation if it is if (backgroundWorker1.IsBusy) { backgroundWorker1.CancelAsync(); } } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { Thread.Sleep(1000); backgroundWorker1.ReportProgress(i); //Check if there is a request to cancel the process if (backgroundWorker1.CancellationPending) { e.Cancel = true; backgroundWorker1.ReportProgress(0); return; } } //If the process exits the loop, ensure that progress is set to 100% //Remember in the loop we set i < 100 so in theory the process will complete at 99% backgroundWorker1.ReportProgress(100); } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { if (e.Cancelled) { lblStatus.Text = "Process was cancelled"; } else if (e.Error != null) { lblStatus.Text = "There was an error running the process. The thread aborted"; } else { lblStatus.Text = "Process was completed"; } }