close

 

C# function 執行失敗時, 重複執行.
一般當我寫一個 function, 當這個 function 執行失敗, 我們希望可以再執行幾次, 看是否可以成功, 這是蠻常見的情況, 舉一個 ftp  List() function程式的例子就有這樣的需求, 因為 List() 其實是下一個 LIST 的 command, 如下 :
 
public ArrayList List()
{
 Connect();
 OpenDataSocket();
 try
 {
     SendCommand("LIST");
 }
 catch (Exception ex)
 {
     log.Warn(MethodBase.GetCurrentMethod() + ex.Message);
     throw ex;
 }
 ReadResponse();
 return list;
}

 這個 command 在很多情況下都可能執行失敗, 我們希望失敗時可以再重新執行 List() 幾次, 假設 3 次, 當 3 次都失敗, 才認命.

重點就在我們要怎樣重複執行某個 function, 實做寫一個重複執行的 function , 然後把原先要執行的 function 使用 delegate 方式變成一個 parameter , 丟進重複執行的 function .
 
/// <summary>
///重複執行的 function
/// </summary>
public delegate void DelgFunction();
/// <summary>
///
/// </summary>
/// <param name="RtyTimes">至多重新執行 N 次</param>
/// <param name="interval">重新執行間格時間</param>
/// <param name="throwIfFail">最後一次依然失敗是否丟出 Exception /param>
/// <param name="function"></param>
public void RetryNoArgFunc(int RtyTimes, TimeSpan interval, bool throwIfFail, DelgFunction function)
{
 if (function != null)
 {
   for (int i = 0; i < RtyTimes; ++i)
   {
     try
     {
       function();
       break;
      }
     catch (Exception ex)
     {
       if (i == RtyTimes - 1)
       {
         if (throwIfFail)
         {
                    throw ex;
         }
         else
         {
                    break;
         }
       }
       else
       {
                if (interval != null)
                {
                     System.Threading.Thread.Sleep(interval);
                }
       }
     }
   }
 }
}


在呼叫 List() 的地方變成,
try
{
   RetryNoArgFunc(3,TimeSpan.FromSeconds(1), true, delegate
   {
                        FileList = this.List();
   });
}
catch (Exception ex)
{
    log.Error(MethodBase.GetCurrentMethod() +" reTry until error, "+ ex.Message);
    throw ex;
}

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 py3939 的頭像
    py3939

    老爹寫程式

    py3939 發表在 痞客邦 留言(0) 人氣()