У нас получился следующий сценарий:
class Program
{
static void Main(string[] args)
{
// trigger the delayed function
trigger();
// cancel the running task.
_token.Cancel();
// keep window open ;-)
Console.ReadLine();
}
private static CancellationTokenSource _token = null;
private static async void trigger()
{
_token = new CancellationTokenSource();
try
{
// run task
await Task.Run(async () =>
{
// wait time
await Task.Delay(2500);
// we should be cancelled here !!
Console.WriteLine(string.Format("IsCancellationRequested={0}", _token.Token.IsCancellationRequested));
Console.WriteLine("SHOULD NOT HAPPEN");
}, _token.Token);
}
catch (TaskCanceledException)
{
}
}
}
IMO ожидаемое поведение заключается в том, что операция задачи отменяется в основном после обработки Task.Delay(2500).
Но консоль печатает:
IsCancellationRequested=True
SHOULD NOT HAPPEN
Это просто похоже на ошибку. Если вы добавите параметр CancellationToken в качестве параметра Task.Delay-Function, он будет работать должным образом.
Итак, как обработать отмену, если функция внутри задачи использует Task.Delay, о чем вы можете не знать?
CancellationToken
. Я не думаю, что это означает то, что вы думаете. - person Stephen Cleary   schedule 10.07.2015