/// <summary> /// Пытается 1 раз выполнить код. Прерывает выполнение в случае возникновения ошибки. /// </summary> /// <param name="tryCode">Код для выполнения.</param> private void TryExecuteSingle(TryExecuteCode tryCode) { if (tryCode == null) { throw new ArgumentNullException("tryCode"); } try { //пытаемся выполнить код. tryCode(); } catch (Exception ex) { ///логируем последюю ошибку. this.WriteEventLog(ex); //выбрасываем ошибку на верх. throw; } }
/// <summary> /// Пытается 5 раз выполнить код с задержкой 200мс в случае неудачных попыток. /// </summary> /// <param name="tryIndex">Индекс попытки. Стартовое значение должно быть равно 0.</param> /// <param name="tryCode">Код для выполнения.</param> private void TryExecuteInternal(int tryIndex, TryExecuteCode tryCode) { if (tryCode == null) { throw new ArgumentNullException("tryCode"); } try { //пытаемся выполнить код. tryCode(); } catch (Exception ex) { //если количество попыток достигло максимального, выбрасываем исключение наверх. if (tryIndex == MaxTryCount - 1) { //логируем последюю ошибку. this.WriteEventLog(ex); //выбрасываем ошибку на верх. throw; } else { //логируем первую ошибку. if (tryIndex == 0) { this.WriteEventLog(ex); } //выполняем задержку в 200мс. Thread.Sleep(200); //предпринимаем следующую попытку выполнения кода, увеличивая индекс попытки. this.TryExecuteInternal(tryIndex + 1, tryCode); } } }
/// <summary> /// Пытается 5 раз выполнить код с задержкой 200мс в случае неудачных попыток. /// </summary> /// <param name="tryCode">Код для выполнения.</param> private void TryExecute(TryExecuteCode tryCode) { this.TryExecuteInternal(0, tryCode); }