/// <summary> /// invoke action, when fails call errorNotify to notify users if it is not null /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="action"></param> /// <param name="obj"></param> /// <param name="exceptionHandler">错误处理,最终出现错误时会通知</param> public void Invoke <T>(Action <T> action, T obj, Action <RetryException> exceptionHandler = null) { if (action == null) { throw new ArgumentNullException("action is null"); } int tryCount = 0; RetryException retryException = null; while (true) { try { action(obj); //一定要return,否则死循环 return; } catch (Exception ex) { tryCount++; #region 异常处理 if (retryException == null) { retryException = new RetryException(); } retryException.Enqueue(ex); if (tryCount >= TryCount) { if (exceptionHandler != null) { exceptionHandler(retryException); } return; } #endregion if (TryInterval != null) { try { Thread.Sleep(TryInterval.Value); } catch (Exception) { //ignore } } } } }
/// <summary> /// invoke func, when fails call errorNotify to notify users if it is not null /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="func"></param> /// <param name="obj"></param> /// <param name="exceptionHandler">错误处理,最终出现错误时会通知</param> /// <returns></returns> public TResult Invoke <T, TResult>(Func <T, TResult> func, T obj, Action <RetryException> exceptionHandler = null) { if (func == null) { throw new ArgumentNullException("action is null"); } int tryCount = 0; RetryException retryException = null; while (true) { try { return(func(obj)); } catch (Exception ex) { tryCount++; #region 异常处理 if (retryException == null) { retryException = new RetryException(); } retryException.Enqueue(ex); if (exceptionHandler != null && tryCount >= TryCount) { exceptionHandler(retryException); } #endregion if (tryCount >= TryCount) { return(default(TResult)); } if (TryInterval != null) { try { Thread.Sleep(TryInterval.Value); } catch (Exception) { //ignore } } } } }