C# CancellationToken未导致引发OperationCanceledException
我想使用CancellationToken重新启动任务,以防它已经在运行。这是我的密码:C# CancellationToken未导致引发OperationCanceledException,c#,.net,wpf,C#,.net,Wpf,我想使用CancellationToken重新启动任务,以防它已经在运行。这是我的密码: CancellationTokenSource cancellationTokenSource; CancellationToken cancellationToken; private void OnButtonCLick(object sender, RoutedEventArgs e) { cancellationTokenSource?.Cancel(); cancellatio
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);
您的任务是读取cancellationToken字段,该字段将指向新的尚未取消的令牌。相反,您必须确保继续使用最初分配给任务的任务:
var token = cancellationToken;
Task.Run(() =>
{
try
{
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine("test");
// ... calculation lasting few milliseconds ...
}
}
catch (OperationCanceledException ex) { }
}, token);