2016-04-06 63 views
0

我想創建一個通用函數,我可以指定要調用的方法&它應該嘗試在失敗之前獲取結果的次數。c#或vb通用函數重試代碼塊n次數

喜歡的東西:

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

其次,返回類型應該會自動根據功能被調用調整。

例如我應該可以從以下兩個函數中得到結果,一個返回字符串&其他Customer實體。

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

這可能嗎?

+0

調用'GetCustomerbyId(id)'時失敗的樣子是什麼?例外?一個'null'字符串?一個'null'對象? – Enigmativity

回答

2

你可以做到以下幾點:

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

問題是如何處理的前n嘗試過程中的異常情況下怎麼辦?我想你可以只記錄異常但知道調用者不會看到它。

+0

感謝vc,這就像一個魅力。確切需要什麼。 – Robin

2

您也可以執行一個循環函數並設置一個變量,以查看嘗試的嘗試次數是否與您實際希望執行的嘗試次數相匹配。

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

感謝您的回答,但是將VC的回覆作爲回答,正如他先回答的那樣。 – Robin

+0

也許upvote的努力,但不客氣:) –

+0

當然,我的道歉忘了投票。謝謝博士 – Robin