检查谓词的C#函数

时间:2018-10-19 11:01:39

标签: c# timeout predicate

我正在编写一个函数,该函数接收要满足的条件并超时,并在满足条件或超时时结束。

这是我到目前为止所拥有的:

public static bool CheckWithTimeout(bool toBeChecked, int msToWait)
{
    //var src = CancellationSource
    var task = Task.Run(()=> {
        while (!toBeChecked)
        {
            System.Threading.Thread.Sleep(25);
        }                    
    });
    if (task.Wait(TimeSpan.FromMilliseconds(msToWait)))
        return toBeChecked;
    else
        return false;
}

它对于简单的布尔效果很好,但我想这样称呼:

CheckWithTimeout(myValue > 10, 500)

并且它将在myValue大于10或经过500 ms时返回(在这种情况下返回false)

我检查了一下,我认为Func是我所需要的,但是..我找不到合适的例子。 此外,如果已经有实现此目的的方法,我肯定会喜欢它。

2 个答案:

答案 0 :(得分:2)

如果使用简单的bool参数,则在调用该方法时将仅对其评估一次。如果要多次执行评估,则需要使用Func<bool>

public static bool CheckWithTimeout(Func<bool> toBeChecked, int msToWait)
{
    //var src = CancellationSource
    var task = Task.Run(()=> {
        while (!toBeChecked())
        {
            System.Threading.Thread.Sleep(25);
        }                    
    });
    if (task.Wait(TimeSpan.FromMilliseconds(msToWait)))
        return toBeChecked();
    else
        return false;
}

现在您可以使用lambda调用该方法:

CheckWithTimeout(() => myValue > 10, 500)

或者只是创建一个返回bool并将其名称传入的方法。

答案 1 :(得分:2)

最好将单独的任务用于结果和等待。

B

这样,您就不必等待超时。 (而且Taks.Delay比Task.Wait更好,因为它不会阻塞)

编辑:带有函数或谓词的示例