这个question回答了我们如何异步等待任务完成超时。
我编写了一个类似的异步方法,如下所示,它检查当前值是否大于某个定义的阈值。
public async Task<bool> FindThreshold(CancellationTokenSource cts)
{
await Task.Run(()=> {
if (this.currentValue >= this.ThresholdValue) {
this.ThresholdFound = true;
} else {
this.ThresholdFound = false;
}
});
if (ThresholdFound)
return true;
else
return false;
}
基于类似的解决方案given我正在调用函数,如下所示,
var found = await FindThresholdAsyncAsync(cts);
if (await Task.WhenAny(task, Task.Delay(
TimeSpan.FromMilliseconds(Convert.ToDouble(timeout)*1000),
cts.Token) == found)
{
await found;
}
错误消息表明,运算符“==”无法应用于“任务”和“布尔”类型的操作数。我确实理解Task.Delay返回一个任务,但我无法弄清楚为什么它在提到here的解决方案时有效。显然,我遗漏了一些东西,所以任何见解都会非常有用。
答案 0 :(得分:1)
您不能等待FindThreshold
的结果。 Task.WhenAny
获取任务列表并返回第一个任务列表。您必须将其与FindThreshold
返回的任务进行比较,以了解它是否超时。 然后您可以检索结果。
var task = FindThreshold(cts);
if (await Task.WhenAny(task, Task.Delay(
TimeSpan.FromMilliseconds(Convert.ToDouble(timeout)*1000),
cts.Token)) == task)
{
var found = task.Result; // No need to await because we know the task is completed
}
else
{
// Timeout
}