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?
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;
}
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";
}
}