Я обычно использую цикл while, который продолжает выполнять некоторую операцию до тех пор, пока операция не завершится или не истечет время ожидания:
bool success = false
int elapsed = 0
while( ( !success ) && ( elapsed < 10000 ) )
{
Thread.sleep( 1000 );
elapsed += 1000;
success = ... some operation ...
}
Я знаю, что есть несколько способов реализовать это, но основная мысль заключается в том, что я несколько раз пытаюсь выполнить операцию со сном до успеха или я слишком долго спал в совокупности.
Есть ли встроенный .net класс/метод/etc, чтобы избавить меня от повторной записи этого шаблона повсюду? Возможно, ввод - это 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;
}