2016-12-23 72 views
2

在下面,我需要通過nextDB的Lambda表達式中重試:C#傳遞參數與λ

Retry.Do(() => 
{ 
    string nextDB = dbList.Next(); 
    using (DataBaseProxy repo = new DataBaseProxy(nextDB)) 
    { 
     return repo.DoSomething(); 
    } 
}); 

我該怎麼辦呢?這裏是我Retry類:

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

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

     for (int retry = 0; retry < retryCount; retry++) 
     { 
      try 
      { 
       return action(); 
      } 
      catch (Exception ex) 
      { 
       exceptions.Add(ex); 
      } 
     } 

     throw new AggregateException(exceptions); 
    } 
} 
+0

@DavidG - 我相信是這樣 - 我還是希望它運行在待辦事項塊中的代碼 - 但我希望能夠通過一個字符串動作 –

+0

@DavidG不,我不需要返回任何東西。是的 - 我只有一個參數。乾杯 –

回答

4

我想你想在這裏使用Action<T>。例如:

public static void Do<T>(
    Action<T> action, 
    T param, 
    int retryCount = 3) 
{ 
    var exceptions = new List<Exception>(); 

    for (int retry = 0; retry < retryCount; retry++) 
    { 
     try 
     { 
      action(param); 
      return; 
     } 
     catch (Exception ex) 
     { 
      exceptions.Add(ex); 
     } 
    } 

    throw new AggregateException(exceptions); 
} 

你會調用該函數是這樣的:

Do(s => { 
    Console.WriteLine(s); 
}, "test", 3); 

根據您的意見,似乎要在多個數據庫通過和每一個嘗試連續直到你找到一個可行的。一個簡單的選擇是刪除到retryCount,而不是傳入你的數組。

public static void Do<T>(
    Action<T> action, 
    IEnumerable<T> items) 
{ 
    var exceptions = new List<Exception>(); 

    foreach(var item in items) 
    { 
     try 
     { 
      action(item); 
      return; 
     } 
     catch (Exception ex) 
     { 
      exceptions.Add(ex); 
     }   
    } 

    throw new AggregateException(exceptions); 
} 

現在你怎麼稱呼它是這樣的:

Do(s => { 
    Console.WriteLine(s); 
}, new[] { "db1", "db2", "db3" }); 
+0

該死的,我不認爲這對我有效,因爲nextDB將會超出範圍,所以我將無法通過它 –

+1

你是什麼意思?什麼範圍? – DavidG

+0

所以我希望它執行Do塊中的所有內容 - 但是我希望它能通過nextDB來執行每次執行的操作 –