2016-04-06 11 views
0

& çağrılacak yöntemin belirtilemediği bir genel işlev oluşturmaya çalışıyorum; gibiC# veya vb Kod bloğunu tekrar deneme için jenerik işlev n sayısı

şey:

//3 stands for maximum number of times GetCustomerbyId should be called if it fails on first attempt. 
var result = RetryCall(GetCustomerbyId(id),3); 

İkincisi döndürme türü o çağırıyor fonksiyonu göre otomatik olarak ayarlanmalıdır. Örneğin, aşağıdaki işlevlerden ikisinden de sonuç alabilmem gerekir, biri & diğer Müşteri öğesi döndürür.

public static string GetCustomerFullNamebyId(int id){ 
    return dataContext.Customers.Where(c => c.Id.Equals(id)).SingleOrDefault().FullName; 
} 

public static Customer GetCustomerbyId(int id){ 
    return dataContext.Customers.Find(id); 
} 

Bu mümkün mü?

public T Retry<T>(Func<T> getter, int count) 
{ 
    for (int i = 0; i < (count - 1); i++) 
    { 
    try 
    { 
     return getter(); 
    } 
    catch (Exception e) 
    { 
     // Log e 
    } 
    } 

    return getter(); 
} 

const int retryCount = 3; 

Customer customer = Retry(() => GetCustomerByID(id), retryCount); 
string customerFullName = Retry(() => GetCustomerFullNamebyId(id), retryCount); 

soru ilk n girişimleri sırasında istisna durumunda ne yapılacağını etmektir: Aşağıdaki yapabilirsiniz

+0

'GetCustomerbyId (id)' çağrılırken bir hata nasıl görünür? Bir istisna? Bir "boş" dizesi? Bir 'null' nesnesi? – Enigmativity

cevap

2

? Sanırım istisnayı günlüğe kaydedebilirsin ama arayanın görmeyeceğini biliyor olabilirsin.

+0

Teşekkürler vc, bu bir cazibe gibi çalıştı. Tam olarak ne gerekiyordu. – Robin

2

Ayrıca, bir döngü işlevi de yapabilir ve denemelerin sayısını gerçekte yapmak istediğiniz deneme sayısıyla eşleştirmeye çalışıp çalışmadığınızı görmek için bir değişken ayarlayabilirsiniz.

private static void DoSomeTask(int RetryCount) 
    { 
     int Count = 0; 
     while (Count != RetryCount) 
     { 
      DoCustomerLookUp(); // or whatever you want to do 
      Count++; 
     } 
    } 
+0

Cevabınız için teşekkürler, ancak VC'nin cevabını, ilk cevap verdiği yanıt olarak işaretleyin. – Robin

+0

Belki de çaba için bir vesile ama hoş geldiniz :) –

+0

Elbette, özür dilerim oy vermeyi unuttum. Bir kez daha teşekkürler Dr – Robin