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