如果 CancellationTokenSource 有延迟,则 IsCancellationRequested 始终为 false

IsCancellationRequested is always false if CancellationTokenSource with delay

我尝试通过带计时器的 CancellationToken 停止进程。

但 IsCancellationRequested 始终为 false。

我试过打电话 cancellationToken.ThrowIfCancellationRequested(); 没用。

public async Task<IReadOnlyList<ISearchableDevice>> SearchAsync(CancellationToken cancellationToken)
{
    while (!cancellationToken.IsCancellationRequested)
    {
        await Task.Delay(100, cancellationToken);
        cancellationToken.ThrowIfCancellationRequested(); // doesn't work
    }

    IReadOnlyList<ISearchableDevice> devices = new List<ISearchableDevice>();
    return devices;
}

private void OnStartSearchCommandExecuted(object? p)
{
    using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3)))
    {
        try
        {  
             InProgress = true;
             DeviceSearcher.SearchAsync(cts.Token)
                 .ContinueWith(task =>
                 {
                  InProgress = false;

                 }, cts.Token);
         }                
         catch (Exception)
         {
                    // TODO: Add exception handling
         }
    }           
}

哪里错了?

问题是 cts 在超时之前被处理掉了。更准确地说,它是在 SearchAsync 到达第一个 await 之后立即处理的。 你至少有两种方法可以解决这个问题

  1. 使用 await DeviceSearcher.SearchAsync 而不是 DeviceSearcher.SearchAsync().ContinueWith()。这是最好的方法,但它会强制您使 OnStartSearchCommandExecuted 异步。

  2. 删除 using 块并在 .ContinueWith 中手动调用 Dispose(并将其他 post-搜索逻辑移入 ContinueWith 和也不要忘记在异常情况下调用 Dispose(异常是否会发生在 SearchAsync 的同步部分(在第一个 await 之前)或异步部分。))。