close
C# function 執行失敗時, 重複執行.
一般當我寫一個 function, 當這個 function 執行失敗, 我們希望可以再執行幾次, 看是否可以成功, 這是蠻常見的情況, 舉一個 ftp List() function程式的例子就有這樣的需求, 因為 List() 其實是下一個 LIST 的 command, 如下 :
一般當我寫一個 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; } |
全站熱搜
留言列表