构造函数可以抛出的代码的通用重试逻辑

时间:2016-12-21 20:58:34

标签: c# retry-logic

跟进问题: Cleanest way to write retry logic?

在答案中,定义了一个重试函数的泛型类,并将其用作:

php artisan migrate

如何实现泛型重试,构造函数也可以抛出?

所以我不只是想重试:

Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));

我想以通用的方式重试以下块:

   SomeFunctionThatCanFail() 

2 个答案:

答案 0 :(得分:3)

  

构造函数也可以抛出?

一般来说,这是一个坏主意。我建议看看工厂模式:

public class SomeClass
{
  private SomeClass()
  {
  }

  public static SomeClass GetInstance()
  {
    // Throw Exception here, not in constructor
  }

  public void SomeFunctionThatCanFail()
  {
  }
}

现在你可以做到:

Retry.Do(() => 
  SomeClass.GetInstance().SomeFunctionThatCanFail(), 
  TimeSpan.FromSeconds(1));

答案 1 :(得分:0)

我没有意识到我可以将一段代码放入Lambda表达式中。这正是我想要的:

Retry.Do(() => { using (DataBaseProxy db = new DataBaseProxy(dbList.Next())) { .DoSomething(); } }, new TimeSpan(0));