閱讀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