Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用任务调试条件语句_C#_.net_Asynchronous_Task Parallel Library - Fatal编程技术网

C# 使用任务调试条件语句

C# 使用任务调试条件语句,c#,.net,asynchronous,task-parallel-library,C#,.net,Asynchronous,Task Parallel Library,这回答了我们如何在超时的情况下异步等待任务完成 我编写了一个类似的异步方法,如下所示,它检查当前值是否大于某个定义的阈值 public async Task<bool> FindThreshold(CancellationTokenSource cts) { await Task.Run(()=> { if (this.currentValue >= this.ThresholdValue) { t

这回答了我们如何在超时的情况下异步等待任务完成

我编写了一个类似的异步方法,如下所示,它检查当前值是否大于某个定义的阈值

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;
}

错误消息表示运算符“==”不能应用于“Task”和“bool”类型的操作数。我确实理解这个任务。延迟返回一个任务,但我不明白为什么在上述解决方案的情况下它会工作。很明显,我遗漏了一些东西,因此任何见解都会非常有用。

你不能等待
FindThreshold
的结果<代码>任务。当任何一个获取任务列表并返回要结束的第一个任务时。您必须将其与
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有一个返回类型的任务,它仍然抱怨使用“==”表示无法从“bool”转换为System.Threading.Task.Task。另外,我使用了wait关键字,因为根据这个解决方案,我必须等待FindThreshold方法,因为我返回的是Task而不是bool。这就是重点。你不需要等待,因为你需要的是一个比较任务,而不是一个布尔。只有在检查之后,您才等待(或调用
.Result
)获取bool。试试我答案中的密码,你不会有error@kosol实际上,它缺少一个括号。修正了。我觉得自己太蠢了,连我的代码都漏掉了。我现在很清楚了。谢谢您的时间。@KooKiz:我仍然更喜欢
等待
而不是
结果
,即使任务已经完成,原因有两个:1)
结果
将异常包装在
聚合异常
中,这会使错误处理复杂化;2)
await
对未来的代码更改更具弹性(即,大厅里的天才更改了方法,因此任务不再保证在该点完成)。
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
}