2010-07-18 5 views
7

J'ai une tâche en cours d'exécution dans le backgroundworker. En cliquant sur le bouton de démarrage, l'utilisateur démarre le processus et dispose d'un bouton d'annulation pour annuler le traitement.Travailleur d'arrière-plan C#

Lorsque l'utilisateur clique sur annuler, je voudrais montrer une boîte de message que "le processus n'a pas été terminé, voulez-vous continuer".

Ici, je veux que le traitement qui reste à faire seulement après l'entrée de l'utilisateur. Jusqu'à ce que vous voulez arrêter le fil de fond. Quelqu'un peut-il m'aider à ce sujet. Y at-il de toute façon pour arrêter le travailleur de fond pendant un certain temps. Toute sorte d'aide sera appréciée.

Répondre

5

Non intégré. Vous pouvez dire à votre code (sur chaque [n] boucle d'itérations, etc.) de vérifier quelque chose comme un ManualResetEvent pour voir s'il doit continuer à fonctionner (en même temps il vérifie l'annulation). Je ne recommande pas suspendre le fil (Thread.Suspend), puisque vous ne savez pas quels verrous etc il peut tenir à la fois.

D'autre part ... pourquoi ne pas le laisser fonctionner jusqu'à ce que vous savoir il devrait être annulé? Ensuite, il suffit de vérifier l'annulation (il y a un drapeau pour cela) toutes les [...] itérations ...

+0

Peut-être que le traitement nécessite beaucoup de ressources processeur et que le programmeur souhaite renvoyer temporairement des ressources à l'utilisateur pendant qu'il prend sa décision. –

+0

Ou le processus d'arrière-plan fait quelque chose d'irréversible (suppression de fichiers, etc.), qui devrait être interrompu * rapidement * si démarré accidentellement. – Heinzi

2

Si BackgroundWorker travaille sur un objet visible par les deux threads, vous pouvez verrouiller cet objet en attendant que l'utilisateur réponde à la question dans une boîte de dialogue. Cela entraînera l'arrêt du thread du worker jusqu'à ce que le thread générant la boîte de dialogue termine le verrou.

+0

Cela ne ferait que bloquer le travailleur si le thread de travail tente continuellement d'acquérir le verrou et le libère. Et cela pourrait conduire à ce que l'** UI ** soit bloquée si le * travaillé ne le * libère pas à chaque fois. –

+0

A droite, cela dépendra de la façon dont le travailleur utilise l'objet (quand/si le verrou est acquis/libéré). Mais un nouvel objet partagé «fictif» pourrait être utilisé si aucun objet existant n'est traité selon les conditions énoncées ci-dessus (en post et commentaire). – Assaf

Questions connexes