使用task调试条件语句

时间:2016-11-01 21:47:44

标签: c# .net asynchronous task-parallel-library

这个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的解决方案时有效。显然,我遗漏了一些东西,所以任何见解都会非常有用。

1 个答案:

答案 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
}