2009-11-10 15 views
1

J'appelle obackgroundworker.CancelAsync(); sur un arrière-plan travaillant actuellement dans un autre thread, puis en utilisant while (obackgroundworker.IsBusy == true) pour attendre qu'il se termine avant de quitter l'application (au cas où l'utilisateur change d'avis alors que le thread est absent) et je veux fermer proprement)Annulation de la classe d'ouvreur d'arrière-plan, annule le drapeau en attente d'annulation mais n'abandonne pas

l'appartement d'annulation en attente est à true correctement, mais le fil ne quitte pas, dans le thread de travail que j'ai:

backgroundworker obackgroundworker = (backgroundworker)sender; 
if (obackgroundworker.cancellationpending == true) 
    e.cancel = true;    

qui devrait vérifier si une annulation est en attente, puis mettre le drapeau annulé à vrai, et je pense que cela entraîne également la fin du fil ...? ou y at-il une autre fonction que j'ai besoin d'appeler depuis le thread quand il détecte une annulation pour finir réellement?

J'ai lu beaucoup d'exemples qui utilisent des travailleurs d'arrière-plan exactement comme ci-dessus et ne signalent aucun problème.

Sources:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

Merci

+0

Est-ce l'utilisation correcte de obackgroundworker.IsBusy? après que j'appelle l'annulation deviendra-t-elle fausse? Actuellement, il y a une boucle infinie dessus même après que le thread a été demandé pour l'annulation. – Nath

Répondre

9

Réglage e.Cancel true ne pas arrêter l'exécution du BackgroundWorker, il indique seulement que l'opération a été annulée afin que vous puissiez le vérifier en cas RunWorkerCompleted. Vous devez arrêter la tâche en retour du gestionnaire d'événements DoWork:

BackgroundWorker obackgroundworker = (BackgroundWorker)sender; 
if (obackgroundworker.CancellationPending == true) 
{ 
    e.Cancel = true; 
    return; 
} 
+0

Bien sûr, merci :) – Nath

4

Non, couchait la propriété ne causeront pas le fil de mettre fin. Vous devriez revenir de votre méthode à ce moment-là. Par exemple, voici le code de la première de vos liens:

if (bw.CancellationPending) { 
    e.Cancel = true; 
    return; 
} 

Notez la déclaration de retour, de sorte que la méthode se termine. Bien sûr, si vous le faites à partir d'une méthode en profondeur dans la pile, vous devez vous assurer que l'appelant sait se terminer aussi bien, mais normalement pour les threads d'arrière-plan, c'est le "top" niveau "méthode qui vérifie la propriété CancellationPending de toute façon, donc habituellement revenir juste est très bien.