programming - task.run c#
¿Task.Wait(int) detiene la tarea si el tiempo de espera transcurre sin que la tarea finalice? (4)
¿Se canceló la tarea cuando expiró el tiempo de espera o aún se está ejecutando la tarea?
No y sí.
El tiempo de espera pasado a Task.Wait
es para la Wait
, no para la tarea.
Tengo una tarea y espero que tarde menos de un segundo en ejecutarse, pero si demora más de unos pocos segundos, quiero cancelar la tarea.
Por ejemplo:
Task t = new Task(() =>
{
while (true)
{
Thread.Sleep(500);
}
});
t.Start();
t.Wait(3000);
Observe que después de 3000 milisegundos la espera expira. ¿Se canceló la tarea cuando expiró el tiempo de espera o aún se está ejecutando la tarea?
La tarea aún se está ejecutando hasta que explícitamente le pida que se detenga o que su bucle finalice (lo que nunca sucederá).
Puede comprobar el valor de retorno de Esperar para ver esto:
(de http://msdn.microsoft.com/en-us/library/dd235606.aspx ) Valor devuelto
Escriba: System.Boolean true si la Tarea completó la ejecución dentro del tiempo asignado; de lo contrario, falso.
Si desea cancelar una Task
, debe pasar un CancellationToken
cuando cree la tarea. Eso te permitirá cancelar la Task
desde el exterior. Podría anular la cancelación a un temporizador si lo desea.
Para crear una Tarea con un token de Cancelación vea este ejemplo:
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var t = Task.Factory.StartNew(() => {
// do some work
if (token.IsCancellationRequested) {
// Clean up as needed here ....
}
token.ThrowIfCancellationRequested();
}, token);
Para cancelar la Task
llame a Cancel()
en el tokenSource
.
Task.Wait()
espera hasta el período especificado para completar la tarea y devuelve si la tarea se completó en el tiempo especificado (o anterior) o no. La tarea en sí no se modifica y no se basa en esperar.
Lea buenas series: Paralelismo en .NET , Paralelismo en .NET - Parte 10, Cancelación en PLINQ y la clase Parallel por Reed Copsey
Y: .NET 4 Marco de cancelación / Programación paralela: Cancelación de tareas
Compruebe el siguiente código:
var cts = new CancellationTokenSource();
var newTask = Task.Factory.StartNew(state =>
{
var token = (CancellationToken)state;
while (!token.IsCancellationRequested)
{
}
token.ThrowIfCancellationRequested();
}, cts.Token, cts.Token);
if (!newTask.Wait(3000, cts.Token)) cts.Cancel();