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 en retard et le programme n'envoie parfois pas du tout le message en réponse à une pression sur le bouton. Parfois, il est aussi tard que 5 secondes de ce à quoi je m'attendais et le programme se fige. Je veux utiliser un BackgroundWorker pour envoyer le message comme prévu et permettre au programme de fonctionner normalement à tout moment. J'avais le code pour envoyer le message dans un gestionnaire de bouton. Maintenant, Où puis-je mettre ce code équivalent? Je voudrais que tous les de cela à toujours être manipulé par une pression sur le bouton.

Est-ce le gestionnaire approprié?

backgroundWorker1.RunWorkerAsync();

Et dans:

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

Je vais mettre mon code dans le gestionnaire de bouton? 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?

45
demandé sur martijnn2008 2011-06-26 04:08:01

2 réponses

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

L'idée de base est. Thread.Sleep simule juste un peu de travail ici. Remplacez-le par votre appel de routage réel.

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;
}
72
répondu Alex Aza 2011-06-26 00:13:57

Je sais que c'est un peu vieux, mais au cas où un autre débutant traverserait cela, je partagerai du code qui couvre un peu plus les opérations de base, voici un autre exemple qui inclut également la possibilité d'annuler le processus et de signaler à l'utilisateur l'état du processus. Je vais ajouter au-dessus 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";
    }
}
47
répondu TheDanMan 2015-06-10 10:14:48