2012-08-09 7 views
6

I zostały zdefiniowane następujące zadanieContinueWith anulowane Zadanie

var t = Task.Factory.StartNew(
    () => LongRunningMethod(cancellationToken), 
    cancellationToken 
); 

t.ContinueWith(
    Callback, 
    cancellationToken, 
    TaskContinuationOptions.None, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

Wewnątrz LongRunningMethod, sprawdzić, czy token anulowanie ma żądany odwołania, a jeśli tak, to powrót z metody. To działa dobrze.

Jednak wywołanie zwrotne nie jest wywoływane w tym scenariuszu. Callback robi sprawdzony gdybym zastąpić drugą linię powyżej

t.ContinueWith(
    x => Callback(x, cancellationToken), 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

W tej sytuacji zadaniem nadal uważa, że ​​zabrakło do ukończenia.

Dlaczego nie działa pierwsze połączenie? Miałem wrażenie, że TaskContinuationOptions.None oznacza, że ​​wywołanie zwrotne zostanie wywołane niezależnie od stanu wątku.

ja anulowanie zadania przez wywołanie:

_cancellationTokenSource.Cancel(); 

na nieco powiązana uwaga konieczności przechodzenia wokół tokenów odstąpienia wydaje się istotną wadą projektu biblioteki zadań.

Odpowiedz

12

Twoje zadanie kontynuacji przyjmuje Token Anulowania, który anulujesz. Oznacza to, że zadanie kontynuacji, gdy nie zostało uruchomione, jest anulowane. Nie przekazuj tego tokena rzeczom, których nie chcesz anulować.

AnulowanieToken służy do anulowania całego wykresu działań naraz. Możesz wykluczyć rzeczy z anulowania, nie przekazując tokena.

+0

Co robi zadanie TaskContinuationOptions.None? Jeśli mówię TaskContinuationOptions.OnlyOnCancelled, to też nie działa. – user981225

+1

TaskContinuationOptions zapewniają sposób, aby nie wykonać, jeśli zadanie * parent * zostało anulowane. Parametr CancellationToken jest niezależny. – usr

Powiązane problemy