¿Cómo utilizar un BackgroundWorker?

Resuelto angel asked hace 13 años • 3 respuestas

Sé que tiene 3 métodos. En mi programa tengo un método para enviar un mensaje. A menudo llega tarde y el programa a veces no envía ningún mensaje en respuesta a la pulsación de un botón. A veces llega hasta 5 segundos más tarde de lo que esperaría y el programa se congela. quiero usar unBackgroundWorker para enviar el mensaje como se esperaba y permitir que el programa se ejecute normalmente en todo momento. Tenía el código para enviar el mensaje en un controlador de botones. Ahora ¿dónde pongo este código equivalente? Me gustaría que todo esto todavía se manejara presionando un botón.

¿Es este el controlador adecuado?

backgroundWorker1.RunWorkerAsync();

y en:

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

¿Voy a poner mi código en el controlador de botones? 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?

angel avatar Jun 26 '11 07:06 angel
Aceptado

Puede actualizar la barra de progreso solo desde ProgressChangedoRunWorkerCompleted controladores de eventos, ya que están sincronizados con el hilo de la interfaz de usuario.

La idea básica es. Thread.SleepSimplemente simula algo de trabajo aquí. Reemplácelo con su llamada de enrutamiento 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;
}
Alex Aza avatar Jun 26 '2011 00:06 Alex Aza

Sé que esto es un poco antiguo, 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. al usuario el estado del proceso. Voy a agregar encima del código proporcionado 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";
    }
}
TheDanMan avatar Jun 10 '2015 10:06 TheDanMan