Thread BackgroundWorker: mise à jour de l'interface utilisateur et abandon de l'opération

StackOverflow https://stackoverflow.com/questions/282363

  •  08-07-2019
  •  | 
  •  

Question

J'exécute une série d'opérations fastidieuses sur un thread de travail en arrière-plan. À différentes étapes, je mets à jour une barre de progression (formulaire Windows) en appelant un délégué. Cependant, l’une des opérations les plus fréquentes se produit sur une seule ligne de code.

Est-il possible de:

a) Mettez à jour l'interface utilisateur pendant l'exécution de cette seule ligne de code ou affichez au moins une icône animée indiquant à l'utilisateur que le travail est en cours d'exécution.

b) Laissez l’utilisateur annuler le thread de travail en arrière-plan pendant l’exécution de cette seule ligne de code

Était-ce utile?

La solution

Malheureusement, probablement pas. Le thread de travail d'arrière-plan doit appeler ReportProgress pour mettre à jour le thread d'interface utilisateur et surveiller l'AnnulationPending pour savoir s'il doit ou non s'arrêter. Ainsi, si votre thread de travail exécute une opération sur une seule ligne, il n'y a aucun moyen de faire en sorte que cela fonctionne.

Peut-être que j'ai mal compris, alors voici un code qui simule ce que je veux en venir:

public void DoWork() {
    System.Threading.Thread.Sleep(10000);

    // won't execute until the sleep is over
    bgWorker.ReportProgress(100);
}

Autres conseils

a) Vous pouvez afficher un fichier GIF animé sur votre formulaire au lieu d'une barre de progression à l'aide d'un contrôle PictureBox . Vous trouverez des informations détaillées sur la procédure à suivre dans cet article de blog .

b) La classe BackgroundWorker dispose d'une méthode CancelAsync qui enverra une demande d'annulation du fonctionnement en cours.
La CancellationPending DoWork , vous devrez alors interroger cette propriété régulièrement afin de pouvoir effectuer les actions appropriées lorsque sa valeur change.
Notez également que pour que cela fonctionne, vous devez définir la propriété WorkerSupportsCancellation de BackgroundWorker sur "True".

Votre code d'interface utilisateur peut afficher l'animation avant de démarrer le travailleur d'arrière-plan. Si nécessaire, vous pouvez annuler le fil de discussion en arrière-plan. Vous ne pourrez malheureusement pas utiliser le concepteur d’arrière-plan.

Vous pouvez mettre à jour l'interface utilisateur (ou les propriétés de la classe) dans la méthode ReportProgress ()

.

Ainsi, si, comme vous le dites, votre opération de longue date est solide et ne répond pas, comment voudriez-vous calculer ses progrès? C'est évidemment impossible.
Séparez autant que possible vos opérations de votre opération et appelez ReportProgress () après chaque extrait.

Vous n'avez pas mal compris - utiliser ReportProgress ou un délégué (comme moi) permet essentiellement d'atteindre le même objectif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top