Domanda

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

UPD :

così, parliamo di questo articolo, allora: http://msdn.microsoft. com / it-it / library / dd997396.aspx

Ho cambiato il codice un po ':

    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 :. Beh, questo cambia solo task.IsCanceled, che è imho inutile, a causa ho ancora dovuto attuare tutte manualmente

È stato utile?

Soluzione

A causa di commenti, sto distacco un'altra risposta.

Si consideri il seguente codice:

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

tokenSource.Cancel(); 

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

Anche se il tokenSource.Cancel() chiamata viene emesso prima che il compito è stato effettivamente iniziato, ci si può comunque assegnare un thread di lavoro dal pool di thread, quindi si spreca alcune risorse di sistema.

Ma quando si specifica argomentazione token nel Task.Factory.StartNew, l'attività verrà annullata immediatamente, senza assegnazione di un thread di lavoro.

Altri suggerimenti

Cancellazione con Tasks è ancora cooperativa. Lei non vorrebbe un filo ad essere ucciso nel mezzo di qualche operazione critica. È necessario controllare per questo.

CancellationTokens sono migliori di costrutti semplici come un ManualResetEvent per segnalare l'arresto di un'operazione perché si può cascata o combinarli, per esempio, si può avere uno per lo spegnimento generale applicazione e si può combinare con uno per annullare un particolare compito. Il compito deve solo osservare quello CancellationToken ma è possibile cancellarlo da entrambi CancellationTokenSource.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top