检查谓词的 C# 函数

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

它适用于简单的 bool 值,但我想这样调用它:

CheckWithTimeout(myValue > 10, 500)

当 myValue 大于 10 或 500 毫秒时返回(在这种情况下返回 false)

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

最佳答案

最好为结果和等待使用单独的任务。

    private async Task<bool> CheckWithTimeout(Func<bool> toBeChecked, int msToWait)
    {
        var waitTask = Task.Delay(msToWait);
        var checkTask = Task.Run(toBeChecked);
        await Task.WhenAny(waitTask, checkTask);
        return checkTask.IsCompleted && await checkTask;
    }


    private async Task<bool> CheckWithTimeout<T>(Predicate<T> toBeChecked, T predicateParameter, int msToWait)
    {
        var waitTask = Task.Delay(msToWait);            
        var checkTask = Task.Run(() => toBeChecked(predicateParameter));
        await Task.WhenAny(waitTask, checkTask);
        return checkTask.IsCompleted && await checkTask;
    }

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

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

关于检查谓词的 C# 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52891079/

相关文章:

lambda - Kotlin lambda 和类型推断

java - org.hibernate.ejb.criteria.path.Abs​​tractPathImpl.get 中的 NullPointerException

c# - 如何将当前系统时间转换为 UTC 秒

c# - ASP.NET Core 在 ExternalLoginSignInAsync 之后获取 UserId

c# - 使用 Twilio-C 发送消息#

angularjs - AngularJs超时,响应时间长

javascript - 如何构建谓词/表达式/规则/ Action 引擎

c# - 按值更改字典键

sql-server-2008 - 帮助解决SqlException:在非负载情况下,连接超时超时

php - 在 magento 的 pdo_mysql 适配器中缺少 "Lock wait timeout exceeded"处理?