2017-02-26 11 views
-1

どのようにしてケース内部のロジックで無制限の再試行メカニズムは、このようなメインスレッド上で再試行メカニズムを実装

何かを失敗した実装するだろうが、ここであなただけの1つの変更

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

答えて

3

を持っているあなたは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"); 
    } 
} 
+1

それは指数バックオフ(一定量までは指数関数的に睡眠時間を増やす)の代わりに、固定された5秒ごとに時間を眠っを使用することも便利です。 – Evk

関連する問題