2016-12-23 73 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来执行每次执行的操作 –