我嘗試使用計時器通過 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
}
}
}
錯誤在哪里?
uj5u.com熱心網友回復:
問題是cts在達到超時之前處理。更準確地說,它在SearchAsync到達 first之后立即處理await。你至少有兩種方法可以解決這個問題
使用
await DeviceSearcher.SearchAsync代替DeviceSearcher.SearchAsync().ContinueWith()。這是最好的方法,但它會迫使您進行OnStartSearchCommandExecuted異步。洗掉
using塊并Dispose在內部手動呼叫.ContinueWith(并將其他搜索后邏輯移到內部,ContinueWith并且Dispose在發生例外時也不要忘記呼叫(例外會發生在 SearchAsync 的同步部分(在 first 之前await)還是在異步部分。))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392601.html
