[英]Proper way to correlate an OperationCanceledException to a CancellationToken
[英]CancellationToken not causing OperationCanceledException to be thrown
我想重新啟動一個Task
,以防它已經使用CancellationToken
運行。 這是我的代碼:
CancellationTokenSource cancellationTokenSource;
CancellationToken cancellationToken;
private void OnButtonCLick(object sender, RoutedEventArgs e)
{
cancellationTokenSource?.Cancel();
cancellationTokenSource = new CancellationTokenSource();
cancellationToken = cancellationTokenSource.Token;
Task.Run(() =>
{
try
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine("test");
// ... calculation lasting few milliseconds ...
}
}
catch (OperationCanceledException ex) { }
}, cancellationToken);
}
由於某種原因,在調用ThrowIfCancellationRequested()
時不會拋出OperationCanceledException
。 我將其與其他示例進行了比較,但沒有看到為什么這不起作用的原因。 我在這里做錯了什么?
您的任務正在讀取cancellationToken
字段,該字段將指向新的(尚未取消的)令牌。 相反,您必須確保繼續使用最初分配給您的任務的那個:
var token = cancellationToken;
Task.Run(() =>
{
try
{
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine("test");
// ... calculation lasting few milliseconds ...
}
}
catch (OperationCanceledException ex) { }
}, token);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.