run programming parallel net examples example asp c# .net multithreading task-parallel-library task

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();