首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果有延迟的IsCancellationRequested CancellationTokenSource,则CancellationTokenSource总是错误的。

如果有延迟的IsCancellationRequested CancellationTokenSource,则CancellationTokenSource总是错误的。
EN

Stack Overflow用户
提问于 2021-12-24 18:51:07
回答 1查看 210关注 0票数 0

我试着用计时器通过CancellationToken停止进程。

但是IsCancellationRequested总是错误的。

我试着打电话给cancellationToken.ThrowIfCancellationRequested();,它不起作用。

代码语言:javascript
复制
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
         }
    }           
}

哪里出错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-24 19:35:36

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

  1. 使用await DeviceSearcher.SearchAsync而不是DeviceSearcher.SearchAsync().ContinueWith()。这是最好的方法,但它将迫使您生成OnStartSearchCommandExecuted异步.

  1. 删除using块并在.ContinueWith中手动调用Dispose (并在ContinueWith中移动其他的后searh逻辑),并且在出现异常时也不要忘记调用Dispose (是在SearchAsync的同步部分(在第一个await之前)还是在异步部分发生异常)。).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70475839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档