valid - comentarios c# documentacion
¿Cuál es el uso de pasar CanceToken al constructor de la clase de tarea? (1)
ACTUALIZACIÓN: La siguiente pregunta de msdn describe la razón:
Pasar un token a StartNew asocia el token con la tarea. Esto tiene dos beneficios principales:
Si el token ha solicitado la cancelación antes de que la Tarea comience a ejecutarse, la Tarea no se ejecutará. En lugar de pasar a la ejecución, se pasará inmediatamente a cancelado. Esto evita los costos de ejecutar la tarea si solo se cancela mientras se ejecuta de todos modos.
Si el cuerpo de la tarea también está monitoreando el token de cancelación y lanza una OperationCanceledException que contiene ese token (que es lo que hace
ThrowIfCancellationRequested
), entonces cuando la tarea ve esa OCE, verifica si el token de OCE coincide con el token de la Tarea. Si lo hace, esa excepción se ve como un reconocimiento de cancelación cooperativa y la Tarea pasa al estado Cancelado (en lugar de al estado Con fallo).
Aquí hay un código de ejemplo que crea una nueva tarea que simula un largo proceso de ejecución. No hay mucho en la tarea como tal y se enfoca únicamente en las funciones de cancelación. Estoy usando el token de cancelación para cancelar la tarea y el código funciona bien para mí .
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 una cosa que no pude entender es el parámetro de token (CTS.Token) que se pasa al Constructor de tareas. ¿Cuál es el uso real de pasar el parámetro, cuando puedo cancelar la tarea incluso sin pasar el token al constructor? .
Abajo hay 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;
}
};