web-dev-qa-db-fra.com

Comment utiliser un BackgroundWorker?

Je sais qu'il a 3 méthodes. Dans mon programme, j'ai une méthode pour envoyer un message. Il est souvent tard et le programme n'envoie parfois pas le message en réponse à une pression sur un bouton. Parfois, il est aussi tard que 5 secondes de ce à quoi je m'attendais et le programme se fige. Je souhaite utiliser un BackgroundWorker pour envoyer le message comme prévu et permettre au programme de s'exécuter normalement à tout moment. J'ai eu le code pour envoyer le message dans un gestionnaire de bouton. Maintenant, où est-ce que je mets ce code équivalent? J'aimerais que tout cela soit traité par une simple pression sur un bouton.

Est-ce le gestionnaire approprié?

backgroundWorker1.RunWorkerAsync();

et en:

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

Je vais mettre mon code dans le gestionnaire de boutons? Et ceci avant:

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

Carga est mon autre forme où se trouve la barre de progression. Comment utiliser un BackgroundWorker dans ce scénario?

61
angel

Vous pouvez mettre à jour la barre de progression uniquement à partir des gestionnaires d'événements ProgressChanged ou RunWorkerCompleted, car ceux-ci sont synchronisés avec le fil de l'interface utilisateur.

L'idée de base est. Thread.Sleep simule simplement quelques travaux ici. Remplacez-le par votre véritable appel de routage.

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;
}
86
Alex Aza

Je sais que c'est un peu vieux, mais au cas où un autre débutant passerait par là, je partagerai du code qui couvre un peu plus les opérations de base, voici un autre exemple qui inclut également l'option d'annuler le processus et de signaler à l'utilisateur le statut du processus. Je vais ajouter en plus du code donné par Alex Aza dans la solution ci-dessus

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";
    }
}
58
TheDanMan