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ń.
Co robi zadanie TaskContinuationOptions.None? Jeśli mówię TaskContinuationOptions.OnlyOnCancelled, to też nie działa. – user981225
TaskContinuationOptions zapewniają sposób, aby nie wykonać, jeśli zadanie * parent * zostało anulowane. Parametr CancellationToken jest niezależny. – usr