我通常使用 while 循环来继续尝试某些操作,直到操作成功或超时结束:
bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
Thread.sleep( 1000 );
elapsed += 1000;
success = ... some operation ...
}
我知道有几种方法可以实现这一点,但基本要点是我反复尝试一些 sleep 操作直到成功,或者我睡得太久了。
是否有一个内置的 .net 类/方法/等来避免我到处重写这个模式?也许输入是一个 Func(of 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;
}
最佳答案
您可以使用 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));
关于c# - .net 构造 for while 循环超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629219/