В следующем фрагменте кода у меня есть задача, которая отменяется, когда пользователь нажимает любую клавишу. При этом вызывается ContinuationTask с сообщением об отмене задачи. ContinuationTask настроен так, что он запускается только при отмене задачи — и это действительно так.
Но когда я проверяю статус задачи после завершения в вызывающем потоке, я получаю «RanToCompletion». Как это возможно?
Вот код:
private static void ContinuationForCanceledTask()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
Task t = Task.Run(
() =>
{
while (!token.IsCancellationRequested)
{
Console.WriteLine("Nelson: Haha! - I am still running!!");
Thread.Sleep(1000);
}
token.ThrowIfCancellationRequested();
}, token);
//This continuation task is invoked as expected
t.ContinueWith(
(tawsk) =>
{
Console.WriteLine("Tawsk was canceled");
}
, TaskContinuationOptions.OnlyOnCanceled);
Console.WriteLine("Press any key to stop Nelson from laughing at you...");
Console.ReadKey();
tokenSource.Cancel();
t.Wait();
//Returns "RanToCompletion"
Console.WriteLine("State of the Task is {0}", t.Status);
}
try-catch
вt.Wait();
, иначе ваша программа завершится с необработанным исключением. - person kennyzx   schedule 24.12.2014ThrowIfCancellationRequested()
находится вне цикла и не будет выполнен до тех пор, пока задача не выполнит свои основные обязанности. - person Nathan Tuggy   schedule 24.12.2014Canceled
. Очевидно, что код, который вы разместили в своем вопросе, либо на самом деле не тот код, который вы используете, либо во всей вашей программе есть какой-то другой код, которым вы не поделились с нами и который вызывает проблему. Опубликуйте хороший пример кода, если вам нужна помощь. - person Peter Duniho   schedule 24.12.2014async void
ситуация? Хорошее объяснение здесь. - person McGuireV10   schedule 03.02.2019