阅读Task-based Asynchronous Pattern由斯蒂芬Toub我想看看取消如何工作的任务。 在部分消费基于任务的异步模式下等待,在3-RD段落它说:等待任务以取消状态结束不会丢
如果任务或任务TResult>在取消状态等待结束,一个 OperationCanceledException将被抛出。
我想在下面的代码中看到这一点。
static void Main(string[] args)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
Task<int> valueTask = DoStuffAsync(cancellationToken);
Thread.Sleep(TimeSpan.FromSeconds(1));
cancellationTokenSource.Cancel();
Console.WriteLine("value task's status: {0}", valueTask.Status);
Console.ReadLine();
}
而且DoStuffAsync()
方法
static async Task<int> DoStuffAsync(CancellationToken cancellationToken)
{
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
return 42;
}
执行此代码不抛出任何异常,它只是打印:
值任务状态:已取消
现在,我的期望是在DoStuffAsync()
方法s ince await Task.Delay(...)
被取消,我们已经等待任务以cancelled状态结束,因此应该抛出异常(根据TAP文档中的引用),但是如果我在Console.ReadLine()
上放置断点并检查valueTask
它的状态为已取消,异常为null
。
任何人都可以帮助我理解,如果我误读了文档,或者我提出的代码是不正确地复制案件?
引用内容涉及您在等待取消任务时发生的情况。你*永远不会等待任务*!没有人说'Task.Exception'会有一个异常,这只是愚蠢的:)你必须明白,你有两个独立的执行线程在这里,你永远不会同步它们 - 你到底会在什么地方发生异常?在线程池中,查杀整个应用程序? – Luaan