2012-08-26 2 views
8

Je lis beaucoup sur TPL et j'ai découvert comment nous pouvons utiliser le mécanisme d'annulation. Mais je suis coincé avec WaitHandle.Annulation avec WaitHandle

Si je veux annuler la tâche, je peux définir le CancellationTokenSource et le passer avec la tâche et je peux utiliser la méthode ThrowIfCancellationRequested pour annuler la tâche.

Ma question est quand j'ai besoin d'utiliser WaitHandle à des fins d'annulation, et pourquoi une simple annulation ne peut pas fonctionner dans cette situation?

EDIT lien MSDN: http://msdn.microsoft.com/en-us/library/dd997364 .. voir l'écoute en utilisant WaitHandle ..

Juste apprentissage TPL ..

S'il vous plaît aider ..

+0

Pouvez-vous préciser votre point « Quand utiliser WaitHandle ». Et que voulez-vous dire par "simple annulation"? –

+0

Mise à jour de la question –

Répondre

15

Supposons que vous avez un signal de type ManualResetEventSlim et voulez attendre que le signal soit réglé, que l'opération soit annulée ou que l'opération expire. Ensuite, vous pouvez utiliser le Wait method comme suit:

if (signal.Wait(TimeSpan.FromSeconds(10), cancellationToken)) 
{ 
    // signal set 
} 
else 
{ 
    // cancelled or timeout 
} 

Mais si vous avez un signal de type ManualResetEvent, il n'y a pas de méthode d'attente. Dans ce cas, vous pouvez utiliser les WaitHandle et le WaitHandle.WaitAny method pour atteindre le même effet d » CancellationToken:

if (WaitHandle.WaitAny(new WaitHandle[] { signal, cancellationToken.WaitHandle }, 
         TimeSpan.FromSeconds(10)) == 0) 
{ 
    // signal set 
} 
else 
{ 
    // cancelled or timeout 
}