2008-11-11 5 views
5

Je lance une série d'opérations qui prennent beaucoup de temps sur un thread de travail en arrière-plan. À diverses étapes, je mets à jour une barre de progression (formulaire Windows) en invoquant un délégué. Cependant, l'une des opérations les plus longues se produit sur une seule ligne de code.Thread BackgroundWorker: mise à jour de l'interface utilisateur et abandon de l'opération

Est-il possible de:

a) La mise à jour de l'interface utilisateur en cette ligne unique de code est en cours d'exécution, ou afficher au moins une icône animée qui montre l'utilisateur que le travail est fait.

b) permettre à l'utilisateur d'annuler le thread de travail de fond pendant cette ligne unique de code est en cours d'exécution Malheureusement

Répondre

2

, probablement pas. Le thread de travail d'arrière-plan doit appeler ReportProgress pour mettre à jour le thread d'interface utilisateur et il doit regarder le CancellationPending pour savoir s'il doit s'arrêter ou non. Donc, si votre thread de travail est en cours d'exécution en cours d'exécution sur une seule ligne, il n'y a aucun moyen de faire ce travail.

Peut-être, je l'ai mal compris, donc voici le 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); 
} 
1

a) Vous pouvez afficher un GIF animé sur votre formulaire au lieu d'une barre de progression en utilisant un PictureBox contrôle. Vous pouvez trouver des informations détaillées sur la façon de le faire dans this blog post.

b) La classe BackgroundWorker a une méthode CancelAsync qui soumettra une demande d'annulation de l'opération en cours.
La propriété CancellationPending de BackgroundWorker est définie sur "True". Dans votre gestionnaire d'événements DoWork, vous devrez alors régulièrement interroger cette propriété afin de prendre les actions appropriées lorsque sa valeur change.
Notez également que pour que cela fonctionne, vous devez définir la propriété WorkerSupportsCancellation de la propriété BackgroundWorker sur "True".

0

Vous n'avez pas mal compris - en utilisant ReportProgress ou en utilisant un délégué (comme je le fais), vous réalisez essentiellement le même objectif.

1

Votre code d'interface utilisateur peut afficher l'animation avant de démarrer l'arrière-plan, et si besoin est d'annuler, vous pouvez terminer le fil d'arrière-plan. Vous ne serez malheureusement pas capable d'utiliser la conception du travailleur de fond.

1

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

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

Questions connexes