簡體   English   中英

在任務中調用CancellationTokenSource.Cancel()不會將Task.IsCanceled設置為true

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM