[英]Calling CancellationTokenSource.Cancel() within a task does not set Task.IsCanceled to true
如果我叫cancellationTokenSource.Cancel
與取消標記相關的任務中,將OperationCancelledException
正確地拋出,但是, task.IsCanceled
並不總是更新設置為true
,正如所預期的。
使用以下nUnit測試可以快速證明該問題:
var cancellationTokenSource = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() =>
{
cancellationTokenSource.Cancel();
cancellationTokenSource.Token.ThrowIfCancellationRequested();
},
cancellationTokenSource.Token);
try
{
task.Wait(cancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
}
if (task.IsCanceled)
{
Assert.Pass();
}
else
{
Assert.Fail();
}
當我運行此測試時,該測試通過,但是,當我調試該測試(使用Resharper測試運行器)時,該測試失敗。
我認為這與Resharper無關,我認為Resharper可能正在創造一些條件,可能會暴露.Net中的問題。 或者,也許我只是在做一些完全錯誤的事情...有什么見解?
等待Task
時不要使用取消令牌。 這導致Wait
在設置任務狀態之前拋出並移至斷言。
這兩件事是同時發生的,因此實際上這是是否要發生的競賽條件,因此,您不得不嘗試復制問題以及調試時的正確行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.