using System; using System.Collections.Generic; using System.Threading; using Aitex.Core.RT.Event; namespace MECF.Framework.Common.Utilities { /// /// 在另一个线程中,指定失败次数,不断重试直到得到期望结果. /// public class RetryInstance { public static RetryInstance Instance() { return new RetryInstance(); } /// /// 执行Retry /// /// 执行的方法 /// 重试间隔(s) /// 重试次数,设置为0则无限重试 /// 期望得到的返回值 /// 是否抑制异常 /// 返回结果 /// /// public TResult Execute( Func action, int secondsInterval, int retryCount, TResult expectedResult, bool isSuppressException = true ) { var result = default(TResult); var exceptions = new List(); 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; } } }