.net构造for while循环与超时

SFu*_*n28 20 .net c# .net-4.0 .net-2.0

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

bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
     Thread.sleep( 1000 );
     elapsed += 1000;
     success = ... some operation ...     
}
Run Code Online (Sandbox Code Playgroud)

我知道有几种方法可以实现这一点,但基本的一点是,我反复尝试一些操作,一直睡到成功,或者我已经睡了太长时间.

是否有一个内置的.net类/方法/等,以免我在整个地方重写这个模式?也许输入是一个Func(bool)和超时?

编辑
感谢所有贡献者.我选择了sleep()方法,因为它是最不复杂的,我完全反复杂性=)这是我的(仍然需要测试)实现:

 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;
    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 22

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

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;
}
Run Code Online (Sandbox Code Playgroud)

然后:

if (RetryUntilSuccessOrTimeout(() => SomeTask(arg1, arg2), TimeSpan.FromSeconds(10)))
{
    // the task succeeded
}
Run Code Online (Sandbox Code Playgroud)

  • @ SFun28,我在19分钟前发布了我的解决方案,而@scottm在18分钟前发布了他的解决方案。由您决定谁的解决方案优先。 (2认同)

Mic*_*ker 17

你可以用 SpinWait.SpinUntil

请参阅https://msdn.microsoft.com/en-us/library/dd449238(v=vs.110).aspx

bool spinUntil = System.Threading.SpinWait.SpinUntil(() => job.IsDisposed, TimeSpan.FromSeconds(5));
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这没有标记为答案.这显然是答案 - 比100%的任何其他建议更好. (8认同)

Ste*_*end 5

你真的不应该Sleep()用来等待任务完成.完成任务后,您平均浪费500毫秒.

您应该能够使用任务并行库确定性地执行此操作,请参阅此处.

此示例显示如何使用Wait方法或Task类中的等效方法等待单个任务.它还说明了如何使用静态WaitAll和WaitAny方法等待多个任务.