2012-08-14 7 views
3

Say I créer manuellement une tâcheCancellationTokenSource vs mettre fin à la tâche

bool aBoolean = true; 

Task.Factory.StartNew(() => 
    while(aBooloean) { 
     ... 
    } 
} 

Est-il préférable de quitter la tâche en ayant une valeur booléenne globale pour quitter la tâche?

Ou est-il préférable d'utiliser CancellationTokenSource?

Quand est-il approprié d'utiliser CancellationTokenSource pour mettre fin à une tâche? Est-ce que cela lance une exception quand vous utilisez CancellationTokenSource et laissez les choses dans un état incohérent?

Merci

Répondre

3

Avoir un booléen « global » court le risque d'être optimisé ou mis en cache dans le cache du processeur et vous ne pouvez pas voir un changement de valeur. CancellationTokenSource est la recommandée méthode pour annuler un Task. La tâche utilise le jeton pour tester si l'annulation est demandée et renvoie simplement à partir du délégué de l'action de la tâche. Pas besoin de lancer une exception si vous ne le souhaitez pas.

+0

Je ne le savais pas, donc si je définissais le booléen global, il finirait par capter le changement? Ou le changement sera-t-il seulement retardé parce que c'est dans un cache? – TheWommies

+1

Cela dépend de plusieurs circonstances; parfois jamais. Vous pouvez utiliser un champ booléen comme celui-ci, à condition que vous le déclariez 'volatile' ou que vous utilisiez' Thread.VolatileWrite' et 'Thread.VolatileRead'. L'un des avantages de 'CancelationTokenSource' est qu'il est découplé d'une implémentation particulière. Ainsi, vous pouvez partager un jeton entre plusieurs tâches que vous n'avez pas écrites ou tout autre code qui prend en charge un jeton d'annulation. ce qui est très utile si vous faites des tâches en parallèle sur plusieurs classes. –

Questions connexes