Je travaille avec un formulaire WinForm à partir duquel tous les processus dont j'ai besoin sont pilotés. Maintenant, j'essaie d'intégrer un BackgroundWorker
avec un ProgressBar
et un bouton d'annulation dans mon code. Je veux que ce soit localement autour de mon code et non dans une méthode séparée. Pour tester cela, un nouveau formulaire est créé avec une barre de progression (pas encore active) et un bouton pour arrêter une boucle for. Cependant, le code ne fonctionne pas (et la barre de progression n'est même pas encore incluse). Le formulaire se fige immédiatement (voir image), donc je ne peux pas tester le bouton d'annulation. La boucle for est cependant exécutée et "Done: " + l.ToString()
est affichée. Comment puis-je resoudre ceci?Gel de formulaire à l'aide de BackgroundWorker
void stopMeasurement(object sender, EventArgs e)
{
stopMeas = true;
}
public void testcancel() // Test method which is triggered manually
{
int l = 0;
MetingProgress metingProgress = new MetingProgress();
metingProgress.btnCancelmeting.Click += new EventHandler(stopMeasurement);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += (sender, args) =>
{
for (int k = 0; k < 10; k++)
{
Thread.Sleep(1000);
l++;
if (worker.CancellationPending)
break;
}
MessageBox.Show("Done: " + l.ToString());
};
worker.RunWorkerAsync();
while (worker.IsBusy)
{
if (stopMeas)
worker.CancelAsync();
}
metingProgress.Dispose();
MessageBox.Show("All done");
}
Oui, j'ai déjà mon code pour les différentes tâches qui vont devoir aller dans le backgroundworker donc je voudrais avoir une configuration comme dans mon exemple. La boucle for-like ressemble aux tâches à effectuer. – 10a
ok Je vois, alors 'testcancel' est en fait une méthode pour simplement déclencher le thread et le laisser tourner en arrière-plan, et c'est en fait tout à faire.Puisque le thread fonctionnera plus longtemps, vous ne devriez vraiment pas essayer de gérer la disposition du formulaire dans cette méthode! ce serait le travail de la méthode du fil. aussi la ligne 'MessageBox.Show (" All done ");' appartient à l'événement 'DoWork', puisque seul le thread lui-même sait quand le travail est terminé, pas la méthode qui démarre le thread –