如果 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
之后立即处理的。
你至少有两种方法可以解决这个问题
使用 await DeviceSearcher.SearchAsync
而不是 DeviceSearcher.SearchAsync().ContinueWith()
。这是最好的方法,但它会强制您使 OnStartSearchCommandExecuted
异步。
删除 using
块并在 .ContinueWith
中手动调用 Dispose
(并将其他 post-搜索逻辑移入 ContinueWith
和也不要忘记在异常情况下调用 Dispose
(异常是否会发生在 SearchAsync 的同步部分(在第一个 await
之前)或异步部分。))。
我尝试通过带计时器的 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
之后立即处理的。
你至少有两种方法可以解决这个问题
使用
await DeviceSearcher.SearchAsync
而不是DeviceSearcher.SearchAsync().ContinueWith()
。这是最好的方法,但它会强制您使OnStartSearchCommandExecuted
异步。删除
using
块并在.ContinueWith
中手动调用Dispose
(并将其他 post-搜索逻辑移入ContinueWith
和也不要忘记在异常情况下调用Dispose
(异常是否会发生在 SearchAsync 的同步部分(在第一个await
之前)或异步部分。))。