在主线程上实现重试机制



如果内部逻辑失败

,您将如何实现无限重试机制

类似的东西,但是在这里您只有一个更改

 static void Main(string[] args)
 {
      ILog Log = LogManager.GetLogger(typeof(Program));
      try
      {
          StartWorking(Log);
      }
      catch (Exception ex)
      {
          Log.Error("Main exited with error: {0}. Restarting app", ex);
          Thread.Sleep(5000);
          StartWorking(Log);
      }
  }
  private static void StartWorking(ILog Log)
  {
      Foo t = new Foo();
      t.ReadConfiguration();
      t.Login();
      t.StartWorking();
  }

您可以使用while循环:

while (true)
{
    try
    {
        StartWorking(Log);
        // No exception was thrown, exit the loop
        break;
    }
    catch (Exception ex)
    {
        Log.Error("Main exited with error: {0}. Restarting app", ex);
        Thread.Sleep(5000);
    }
}

但是,这是非常糟糕的做法。您绝对不想这样做。取而代之的是,您应该具有重试逻辑,该逻辑在进行了许多重试后,就会放弃。例如:

const int maxRetries = 5;
for (var i = 0; i < maxRetries; i++)
{
    try
    {
        StartWorking(Log);
        // No exception was thrown, exit the loop
        break;
    }
    catch (Exception ex)
    {
        Log.Error("Main exited with error: {0}. Restarting app", ex);
        Thread.Sleep(5000);
    }
    if (i == maxRetries - 1)
    {
        throw new Exception("Sorry, we have reached the maximum number of retries for this operation, just giving up");
    }
}

最新更新