c# - usar - backgroundworker events
¿Cómo usar un BackgroundWorker? (2)
Sé que tiene 3 métodos. En mi programa tengo un método para enviar un mensaje. A menudo es tarde y el programa a veces no envía el mensaje en absoluto en respuesta a la presión de un botón. A veces es tan tarde como 5 segundos de lo que esperaría y el programa se congela. Quiero utilizar un BackgroundWorker
para enviar el mensaje como se espera y permitir que el programa se ejecute normalmente en todo momento. Tenía el código para enviar el mensaje en un manejador de botones. Ahora, ¿dónde pongo este código equivalente? Me gustaría que todo esto se maneje presionando un botón.
¿Es este el controlador apropiado?
backgroundWorker1.RunWorkerAsync();
y en:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}
Voy a poner mi código en el controlador de botón? Y esto antes:
carga.progressBar1.Minimum = 0;
carga.progressBar1.Maximum = 100;
Carga es mi otra forma donde está ProgressBar. ¿Cómo uso un BackgroundWorker en este escenario?
Puede actualizar la barra de progreso solo desde los controladores de eventos ProgressChanged
o RunWorkerCompleted
, ya que están sincronizados con el subproceso de la interfaz de usuario.
La idea básica es Thread.Sleep
simplemente simula algo de trabajo aquí. Reemplácelo con su llamada de ruta real.
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;
}
Sé que esto es un poco viejo, pero en caso de que otro principiante esté pasando por esto, compartiré un código que cubre un poco más de las operaciones básicas, aquí hay otro ejemplo que también incluye la opción de cancelar el proceso y también informar para el usuario el estado del proceso. Voy a agregar encima del código dado por Alex Aza en la solución anterior
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";
}
}