次のシナリオが得られました。
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を使用している場合、キャンセルを処理する方法はわかりません。