Pregunta

http://msdn.microsoft.com/en-us/library/ dd988458.aspx

UPD

Por lo tanto, vamos a discutir este artículo a continuación: http://msdn.microsoft. com / es-es / library / dd997396.aspx

He cambiado el código un poco:

    static void Main()
    {

        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;

        var task = Task.Factory.StartNew(() =>
        {

            // Were we already canceled?
            ct.ThrowIfCancellationRequested();

            bool moreToDo = true;
            Thread.Sleep(5000);
            while (moreToDo)
            {

                // Poll on this property if you have to do
                // other cleanup before throwing.
                if (ct.IsCancellationRequested)
                {
                    Console.WriteLine("exit");
                    // Clean up here, then...
                    ct.ThrowIfCancellationRequested();
                }

            }
        }, tokenSource2.Token); // this parameter useless

        Console.WriteLine("sleep");
        Thread.Sleep(2000);
        Console.WriteLine("cancel");

        tokenSource2.Cancel();

        // Just continue on this thread, or Wait/WaitAll with try-catch:
        try
        {
            task.Wait();
        }
        catch (AggregateException e)
        {
            foreach (var v in e.InnerExceptions)
            {
                Console.WriteLine(e.Message + " " + v.Message);
            }
        }

        Console.ReadKey();
    }

UPD . Bueno, esto cambia sólo task.IsCanceled, que en mi humilde opinión es inútil, debido a que todavía debe implementar todos manualmente

¿Fue útil?

Solución

Debido a los comentarios, Quiero poner otra respuesta.

Considere el siguiente código:

var tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;

tokenSource.Cancel(); 

var task = Task.Factory.StartNew(() =>
{    
  // Were we already canceled?
  ct.ThrowIfCancellationRequested();
  // do some processing
});

Aunque el tokenSource.Cancel() llamada se emite antes de la tarea se inició en realidad, usted todavía asignar un subproceso de trabajo del grupo de subprocesos, por lo que perder algunos recursos del sistema.

Sin embargo, cuando se especifica el argumento token en Task.Factory.StartNew, la tarea será cancelada de inmediato, sin asignar un subproceso de trabajo.

Otros consejos

Cancelación con tareas sigue siendo cooperativa. Usted no quiere un hilo que se mató en medio de una operación crítica. Es necesario comprobar por ello.

CancellationTokens son mejores que las construcciones más simples como un ManualResetEvent para la señalización de cierre de una operación, porque se puede conectar en cascada o combinarlos, por ejemplo, puede tener uno para la detención total de la aplicación y se puede combinar con otro para cancelar una tarea en particular. La tarea sólo tiene que mirar el uno CancellationToken pero se puede cancelar desde cualquiera CancellationTokenSource.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top