2012-08-26 8 views
8

Estoy leyendo mucho en TPL y descubrí las formas en que podemos usar el mecanismo de cancelación. Pero me quedé atrapado con WaitHandle.Cancelación con WaitHandle

Si quiero cancelar la tarea, puedo definir el CancellationTokenSource y pasarlo junto con la tarea y puedo usar el método ThrowIfCancellationRequested para cancelar la tarea.

Mi pregunta es cuando necesito usar WaitHandle para fines de cancelación, y ¿por qué la cancelación simple no puede funcionar en esa situación?

EDITAR enlace de MSDN: http://msdn.microsoft.com/en-us/library/dd997364 .. ver escuchando mediante el uso de WaitHandle ..

El aprendizaje del idioma TPL ..

Por favor, ayuda ..

+0

¿Se puede elaborar en su punto 'Cuándo utilizar WaitHandle'. ¿Y a qué te refieres con "cancelación simple"? –

+0

Actualizó la pregunta .. –

Respuesta

15

Suponga que tiene una señal de tipo ManualResetEventSlim y desea esperar a que se establezca la señal, la operación se cancelará o la operación finalizará. A continuación, puede utilizar el Wait method de la siguiente manera:

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

Pero si usted tiene una señal de tipo ManualResetEvent, no hay tal método Wait. En este caso, puede utilizar los CancellationToken 's WaitHandle y la WaitHandle.WaitAny method para lograr el mismo efecto:

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