2016-04-06 4 views
0

Ich versuche, eine generische Funktion zu erstellen, an die ich die Methode & angeben kann, wie oft es versuchen sollte, Ergebnis zu erhalten, bevor es fehlschlägt.C# oder vb Generische Funktion zum Wiederholen des Codeblocks n mal

Etwas wie:

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

Zweitens sollte der Rückgabetyp automatisch anhand der Funktion eingestellt werden, es anruft.

Zum Beispiel sollte ich in der Lage sein, Ergebnis von beiden folgenden Funktion zu erhalten, gibt eine Zeichenfolge & andere Customer-Entität zurück.

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); 
} 

Ist das möglich?

+0

Wie sieht ein Fehler beim Aufruf von 'GetCustomerbyId (id)' aus? Eine Ausnahme? Eine 'Null'-Zeichenfolge? Ein 'Null'-Objekt? – Enigmativity

Antwort

2

Sie können Folgendes tun:

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); 

Frage ist, was in den ersten n Versuche bei Ausnahme zu machen? Ich denke, Sie könnten die Ausnahme einfach protokollieren, aber beachten Sie, dass der Anrufer es nicht sehen wird.

+0

Dank vc, das hat wie ein Charme funktioniert. Genau was benötigt wurde. – Robin

2

Sie könnten auch eine Schleifenfunktion ausführen und eine Variable setzen, um zu sehen, ob die Anzahl der versuchten Versuche mit der Anzahl der Versuche übereinstimmt, die Sie tatsächlich ausführen möchten.

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

danke für deine Antwort es funktioniert, jedoch Kennzeichnung VC Antwort als Antwort, wie er zuerst antwortete. – Robin

+0

Vielleicht ein Upvote für die Anstrengung, aber Sie sind herzlich willkommen :) –

+0

Sicher, meine Entschuldigung vergessen zu Up-Abstimmung. Nochmals vielen Dank Dr – Robin

Verwandte Themen