首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.net如何构造while循环与超时?

.net如何构造while循环与超时?
EN

Stack Overflow用户
提问于 2018-03-16 00:52:28
回答 2查看 0关注 0票数 0

我通常使用一个while循环,继续尝试某些操作,直到操作成功或超时过去:

代码语言:txt
复制
bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
     Thread.sleep( 1000 );
     elapsed += 1000;
     success = ... some operation ...     
}

我知道有几种方法可以实现这一点,但基本的观点是,我反复尝试一些睡眠操作,直到成功,或者我睡了太久。

有没有一个内置的.net类/方法/等,以避免我在这个地方重写这个模式?也许输入是一个Func(bool)和超时? 我选择了sleep()方法,因为它是最简单的,而我完全是反复杂性=)这是我的(仍然需要测试)implimentation:

代码语言:txt
复制
 public static bool RetryUntilSuccessOrTimeout( Func<bool> task , TimeSpan timeout , TimeSpan pause )
    {

        if ( pause.TotalMilliseconds < 0 )
        {
            throw new ArgumentException( "pause must be >= 0 milliseconds" );
        }
        var stopwatch = Stopwatch.StartNew();
        do
        {
            if ( task() ) { return true; }
            Thread.Sleep( ( int )pause.TotalMilliseconds );
        }
        while ( stopwatch.Elapsed < timeout );
        return false;
    }
EN

回答 2

Stack Overflow用户

发布于 2018-03-16 09:18:22

可以将算法封装在一个方法中:

代码语言:txt
复制
public bool RetryUntilSuccessOrTimeout(Func<bool> task, TimeSpan timeSpan)
{
    bool success = false;
    int elapsed = 0;
    while ((!success) && (elapsed < timeSpan.TotalMilliseconds))
    {
        Thread.Sleep(1000);
        elapsed += 1000;
        success = task();
    }
    return success;
}

然后:

代码语言:txt
复制
if (RetryUntilSuccessOrTimeout(() => SomeTask(arg1, arg2), TimeSpan.FromSeconds(10)))
{
    // the task succeeded
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-16 10:21:24

我不知道现有的东西,但我认为你可以创建一个方法来接受超时和成功判断函数。像这样的东西:

代码语言:txt
复制
public static bool KeepTrying(int timeout, Func<bool> operation)
{
    bool success = false;
    int elapsed = 0;
    while ((!success) && (elapsed < timeout))
    {
        Thread.Sleep(1000);
        elapsed += 1000;
        success = operation();
    }
    return success;
}

或者你的函数可能更“健壮”,你可以将它与灵活的参数结合起来:

代码语言:txt
复制
public bool KeepTrying(int timeout, Func<object[], bool> operation, params object[] arguments)
{
    bool success = false;
    int elapsed = 0;
    while ((!success) && (elapsed < timeout))
    {
        Thread.Sleep(1000);
        elapsed += 1000;
        success = operation(arguments);
    }
    return success;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档