2012-06-01 13 views
19

Aquí hay un código de muestra que crea una nueva tarea que simula un proceso de larga ejecución. No hay mucho en la tarea como tal y se centra exclusivamente en las características de cancelación. Estoy utilizando un token de cancelación para cancelar la tarea y el código funciona bien para mi.¿De qué sirve pasar el constructor CancellationToken to Task Class?

 CancellationTokenSource CTS= new CancellationTokenSource(); 

     Task<Boolean> PTask = new Task<Boolean>(() => 
     { 
      while (true) 
      { 
       if (!CTS.Token.IsCancellationRequested) 
       { 
        Thread.Sleep(5000); 
       } 
       else{Console.WriteLine("Thread Cancelled");break;} 
      } 
      return true; 

     }, CTS.Token, TaskCreationOptions.None); 

     PTask.Start(); 
     Console.WriteLine("Hit Enter to cancel the Secondary thread you have started"); 
     Console.ReadLine(); 
     CTS.Cancel(); 
     System.Console.WriteLine(PTask.Result); 

    } 
} 

Pero onething que no pude entender es el parámetro token (CTS.Token) que se pasa a la tarea Constructor.What es el uso real de pasar el parámetro, cuando realmente puedo cancelar la tarea incluso sin pasar token al constructor.

A continuación se muestra una versión ligeramente modificada que funciona sin el parámetro token.

 CancellationTokenSource CTS= new CancellationTokenSource(); 
     Task<Boolean> PTask = new Task<Boolean>(() => 
     { 
      while (true) 
      { 
       if (!CTS.Token.IsCancellationRequested) 
       { 
        Thread.Sleep(5000); 
       } 
       else 
       { 
        Console.WriteLine("Thread Cancelled"); 
        break; 
       } 
     }; 
+1

Yo recomendaría la lectura: http://blogs.msdn.com/b/pfxteam/archive/2009/05/22/9635790.aspx – Slugart

Respuesta

35

ACTUALIZACIÓN: La siguiente pregunta msdn describe la razón:

El paso de un token en StartNew asocia el símbolo con el Grupo. Esto tiene dos ventajas principales:

  1. Si el token tiene cancelación solicitada antes de la tarea de comenzar la ejecución, la tarea no se ejecutar. En lugar de hacer la transición a Ejecutar, cambiará de inmediato a a Cancelado. Esto evita los costos de ejecutar la tarea si simplemente se cancelará mientras se ejecuta de todos modos.

  2. Si el cuerpo de la tarea también está supervisando la cancelación de token y lanza una OperationCanceledException que contiene esa señal (que es lo que ThrowIfCancellationRequested hace), entonces cuando la tarea se ve que OCE, comprueba si de contadores al OCE coincide con el token de Tarea. Si es , esa excepción se considera como un reconocimiento de cancelación cooperativa y la Tarea pasa al estado Cancelado (más bien que el estado Fallo).

+0

¿Estás diciendo que el iscancelrequest cheque con la muestra de primaria el hilo no es seguro. –

+0

No veo ninguna otra razón para pasar el token al constructor, pero si me pregunta si estoy 100% seguro; bueno no – daryal

+0

He actualizado, de hecho esto no tiene nada que ver con la seguridad del hilo. – daryal