SORU
13 EKİM 2009, Salı


C# yazmak için yolu yeniden deneme mantığı temiz?

Bazen birkaç kez vazgeçmeden önce bir işlemi yeniden denemek için bir ihtiyaç var. Benim kod gibi

int retries = 3;
while(true) {
  try {
    DoSomething();
    break; // success!
  } catch {
    if(--retries == 0) throw;
    else Thread.Sleep(1000);
  }
}

Genel bir yeniden deneme fonksiyonu gibi bu yeniden yazmak istiyorum:

TryThreeTimes(DoSomething);

C olasıdır#? TryThreeTimes() yöntemi için kod ne olurdu?

CEVAP
13 EKİM 2009, Salı


Sadece aynı çağrıyı yeniden deneyin battaniye catch ifadeleri genel bir istisna işleme mekanizması olarak kullanılırsa tehlikeli olabilir. Burada lambda tabanlı bir olduğunu söyledikten sonra yeniden deneyin herhangi bir yöntem ile kullanabileceğiniz bir paket. Yeniden deneme sayısı faktörü için seçtim ve biraz daha esnek bir parametre olarak zaman aşımı dışında yeniden deneme:

public static class Retry
{
   public static void Do(
       Action action,
       TimeSpan retryInterval,
       int retryCount = 3)
   {
       Do<object>(() => 
       {
           action();
           return null;
       }, retryInterval, retryCount);
   }

   public static T Do<T>(
       Func<T> action, 
       TimeSpan retryInterval,
       int retryCount = 3)
   {
       var exceptions = new List<Exception>();

       for (int retry = 0; retry < retryCount; retry  )
       {
          try
          { 
              if (retry > 0)
                  Thread.Sleep(retryInterval);
              return action();
          }
          catch (Exception ex)
          { 
              exceptions.Add(ex);
          }
       }

       throw new AggregateException(exceptions);
   }
}

Şimdi bu programı yöntemi yeniden deneme mantığı gerçekleştirmek için kullanabilirsiniz:

Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));

ya da:

Retry.Do(SomeFunctionThatCanFail, TimeSpan.FromSeconds(1));

ya da:

int result = Retry.Do(SomeFunctionWhichReturnsInt, TimeSpan.FromSeconds(1), 4);

Ya async aşırı yüklenme yapabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011