C# CancellationToken未导致引发OperationCanceledException

C# CancellationToken未导致引发OperationCanceledException,c#,.net,wpf,C#,.net,Wpf,我想使用CancellationToken重新启动任务,以防它已经在运行。这是我的密码: CancellationTokenSource cancellationTokenSource; CancellationToken cancellationToken; private void OnButtonCLick(object sender, RoutedEventArgs e) { cancellationTokenSource?.Cancel(); cancellatio

我想使用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);
您的任务是读取cancellationToken字段,该字段将指向新的尚未取消的令牌。相反,您必须确保继续使用最初分配给任务的任务:

var token = cancellationToken;

Task.Run(() =>
{
    try
    {
        while (true)
        {
            token.ThrowIfCancellationRequested();
            Console.WriteLine("test");
            // ... calculation lasting few milliseconds ...
        }
    }
    catch (OperationCanceledException ex) { }
}, token);