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
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.
Dosya için satır yazmak için doğru yol...
Python çoklu kurucular için temiz, pyt...
Bir Uİİmage yeniden boyutlandırmak içi...
Nasıl ActiveRecord modeli ve Raylar ta...
Hata ayıklama için ipuçları .debug kur...