Frage

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

UPD :

so, lassen Sie uns in diesem Artikel diskutieren dann: http://msdn.microsoft. com / en-us / library / dd997396.aspx

Ich habe diesen Code ein wenig geändert:

    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 . Nun, dies ändert sich nur task.IsCanceled, die imho nutzlos ist, aufgrund ich sollte noch alles von Hand implementieren

War es hilfreich?

Lösung

Durch Kommentare, ich bin Entsendung eine andere Antwort.

Betrachten Sie den folgenden Code ein:

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

tokenSource.Cancel(); 

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

Auch wenn der Anruf tokenSource.Cancel() ausgegeben wird, bevor die Aufgabe tatsächlich gestartet wurde, werden Sie noch einen Worker-Thread von Thread-Pool zuweisen, so dass Sie einige Systemressourcen verschwenden werden.

Aber wenn Sie Token Argument in Task.Factory.StartNew angeben, wird die Aufgabe sofort abgebrochen werden, ohne dass ein Arbeiter-Thread zugeordnet wird.

Andere Tipps

Stornierung mit Aufgaben ist noch kooperativ. Sie würden nicht ein Thread getötet werden in der Mitte einige kritische Operation wollen. Sie müssen sich für sie überprüfen.

CancellationTokens sind besser als einfache Konstrukte wie ein ManualResetEvent zum Abschalten einer Operation signalisiert, weil man sie kaskadieren oder kombinieren kann, zum Beispiel, können Sie einen für die allgemeine Anwendung Herunterfahren und Sie es mit einer zum Löschen einer bestimmte Aufgabe kombinieren. Die Aufgabe hat nur an dem einen CancellationToken zu sehen, aber Sie können es von beiden CancellationTokenSource aufheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top