我试着用计时器通过CancellationToken停止进程。
但是IsCancellationRequested总是错误的。
我试着打电话给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
}
}
}哪里出错了?
发布于 2021-12-24 19:35:36
问题是cts是在到达超时之前被释放的。更准确地说,它是在SearchAsync到达第一个await后立即处理的。你至少有两种方法来解决这个问题
await DeviceSearcher.SearchAsync而不是DeviceSearcher.SearchAsync().ContinueWith()。这是最好的方法,但它将迫使您生成OnStartSearchCommandExecuted异步.。
using块并在.ContinueWith中手动调用Dispose (并在ContinueWith中移动其他的后searh逻辑),并且在出现异常时也不要忘记调用Dispose (是在SearchAsync的同步部分(在第一个await之前)还是在异步部分发生异常)。).https://stackoverflow.com/questions/70475839
复制相似问题