我通常使用一个while循环,继续尝试某些操作,直到操作成功或超时过去:
bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
Thread.sleep( 1000 );
elapsed += 1000;
success = ... some operation ...
}
我知道有几种方法可以实现这一点,但基本的观点是,我反复尝试一些睡眠操作,直到成功,或者我睡了太久。
有没有一个内置的.net类/方法/等,以避免我在这个地方重写这个模式?也许输入是一个Func(bool)和超时? 我选择了sleep()方法,因为它是最简单的,而我完全是反复杂性=)这是我的(仍然需要测试)implimentation:
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;
}
发布于 2018-03-16 09:18: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;
}
然后:
if (RetryUntilSuccessOrTimeout(() => SomeTask(arg1, arg2), TimeSpan.FromSeconds(10)))
{
// the task succeeded
}
发布于 2018-03-16 10:21:24
我不知道现有的东西,但我认为你可以创建一个方法来接受超时和成功判断函数。像这样的东西:
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;
}
或者你的函数可能更“健壮”,你可以将它与灵活的参数结合起来:
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;
}
https://stackoverflow.com/questions/-100007637
复制相似问题