12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using Aitex.Core.RT.Event;
- namespace MECF.Framework.Common.Utilities
- {
- /// <summary>
- /// 在另一个线程中,指定失败次数,不断重试直到得到期望结果.
- /// </summary>
- public class RetryInstance
- {
- public static RetryInstance Instance()
- {
- return new RetryInstance();
- }
- /// <summary>
- /// 执行Retry
- /// </summary>
- /// <param name="action">执行的方法</param>
- /// <param name="secondsInterval">重试间隔(s)</param>
- /// <param name="retryCount">重试次数,设置为0则无限重试</param>
- /// <param name="expectedResult">期望得到的返回值</param>
- /// <param name="isSuppressException">是否抑制异常</param>
- /// <typeparam name="TResult">返回结果</typeparam>
- /// <returns></returns>
- /// <exception cref="AggregateException"></exception>
- public TResult Execute<TResult>(
- Func<TResult> action,
- int secondsInterval,
- int retryCount,
- TResult expectedResult,
- bool isSuppressException = true
- )
- {
- var result = default(TResult);
- var exceptions = new List<Exception>();
- if (retryCount == 0)
- {
- retryCount = Int32.MaxValue;
- }
- for (var retry = 0; retry < retryCount; retry++)
- {
- try
- {
- if (retry > 0) Thread.Sleep(secondsInterval * 1000);
- EV.PostInfoLog(action.ToString(),$"Retry Instance executing {retry+1} times, result : {result}");
- result = action();
- }
- catch (Exception ex)
- {
- exceptions.Add(ex);
- }
- if (result.Equals(expectedResult)) return result;
- }
- if (!isSuppressException)
- throw new AggregateException(exceptions);
- else
- return result;
- }
- }
- }
|