2010-10-27 16 views
26

Tengo una tarea y espero que tarde menos de un segundo en ejecutarse, pero si lleva más de unos segundos quiero cancelar la tarea.Does Task.Wait (int) detiene la tarea si el tiempo de espera transcurre sin que la tarea finalice?

Por ejemplo:

Task t = new Task(() => 
     { 
      while (true) 
      { 
       Thread.Sleep(500); 
      } 
     }); 
t.Start(); 
t.Wait(3000); 

en cuenta 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?

+2

¿Por qué no utilizar la aplicación de cancelación? –

+0

¿Cuál es la API de cancelación? –

+0

verifique mi respuesta Puse algunos enlaces al respecto –

Respuesta

12

Si desea cancelar un Task, que debe pasar en a CancellationToken cuando crea la tarea. Eso le permitirá cancelar el Task desde el exterior. Podría vincular la cancelación a un temporizador si lo desea.

para crear una tarea con un token de cancelación ver 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 llamada TaskCancel() en el tokenSource.

+3

¿Esto no le permite solo * solicitar * cancelación "desde el exterior"? ¿No le correspondería al delegado si presta atención a la solicitud basada en token y realmente lanza o simplemente continúa trabajando sin cancelación? – BitMask777

+0

Correcto, el delegado decide si actuará sobre la solicitud marcando 'IsCancellationRequest' en la propiedad. –

7

La tarea sigue ejecutándose hasta que explícitamente le diga que se detenga o que termine su ciclo (lo que nunca ocurrirá).

se puede comprobar el valor de retorno de esperar a ver esto:

(de http://msdn.microsoft.com/en-us/library/dd235606.aspx) Valor de retorno

Tipo: System.Boolean cierto si el Grupo completó la ejecución dentro del tiempo asignado; de lo contrario, falso.

5

¿Se canceló la tarea cuando expiró el tiempo de espera o la tarea aún se está ejecutando?

No y Sí.

El tiempo de espera pasó a Task.Wait es para el Wait, no es la tarea.

+0

Esto es interesante, porque el texto de ayuda aquí parece decir lo contrario: https://msdn.microsoft.com/en-us/library/dd270644(v=vs.110).aspx dice, _ "Espera a que la tarea complete la ejecución dentro de un número específico de milisegundos . "_ No estoy seguro si entiendo esto todavía. –

+0

@Michael Si el tiempo transcurrido para 'Wait' expira, volverá, incluso si la tarea no se ha completado. En este caso de tiempo de espera, la tarea continuará ejecutándose hasta que se complete (y un posterior 'Wait 'volverá así como completado). – Richard

47

Task.Wait() espera hasta período especificado para completar la tarea y devuelve si la tarea se completó en el período de tiempo especificado (o antes) o no. La tarea en sí no se modifica y no depende de la espera.

Leer bonita serie: Parallelism in .NET, Parallelism in .NET – Part 10, Cancellation in PLINQ and the Parallel class por Reed Copsey

Y: .NET 4 Cancellation Framework/Parallel Programming: Task Cancellation

Comprobar 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(); 
+0

Gracias nick este es un código impresionante –

+0

Me complace ayudarte –

+0

Me di cuenta de que el 'cts.Token' también se pasa al método' Wait() '. Encontré una nota en la documentación de Microsoft: _ "Pasar el objeto cancelaciónToken a este método simplemente permite que se cancele la espera en función de alguna condición". _ Https://msdn.microsoft.com/en-us/library/dd321457%28v = vs.110% 29.aspx –

Cuestiones relacionadas