【问题标题】:debugging conditional statements using task使用任务调试条件语句
【发布时间】:2016-11-02 07:02:36
【问题描述】:

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 的解决方案的情况下工作。显然,我遗漏了一些东西,所以任何见解都会非常有帮助。

【问题讨论】:

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


    【解决方案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
    }
    

    【讨论】:

    • 由于 FindThreshold 的返回类型为 Task,它仍然抱怨使用 '==' 表示无法从 'bool' 转换为 System.Threading.Task.Task。另外,我使用了 await 关键字,因为根据这个解决方案link 我必须等待 FindThreshold 方法,因为我返回的是 Task 而不是 bool。
    • 这就是重点。您不需要等待,因为您需要一个任务来进行比较,而不是布尔值。只有在检查之后,您才等待(或致电.Result)获取布尔值。试试我回答中的代码,不会报错
    • @kosol 实际上它缺少一个括号。固定。
    • 我觉得自己太愚蠢了,甚至在我的代码中都忽略了这一点。我现在很清楚。感谢您的宝贵时间。
    • @KooKiz:即使任务已经完成,我仍然更喜欢await 而不是Result,原因有两个:1)Result 将异常包装在AggregateException 中,这会使错误处理复杂化;和 2) await 对未来的代码更改更具弹性(即,大厅里的天才改变了方法,因此不再保证任务在那时完成)。
    猜你喜欢
    • 2021-12-08
    • 2017-05-25
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多