public static async Task <ApiResult> ProcessAsync(Func <Task> func, bool continueOnCapturedContext = false, bool needRetry = false, int retryCount = 50, Func <Exception, string> getExceptionMessage = null) { getExceptionMessage = getExceptionMessage ?? GetExceptionMessage; ApiResult apiResult = null; do { try { await func().ConfigureAwait(continueOnCapturedContext); needRetry = false; apiResult = new ApiResult(); } catch (Exception ex) { if (!(ex is OptimisticConcurrencyException) || !needRetry) { var baseException = ex.GetBaseException(); if (baseException is DomainException) { var sysException = baseException as DomainException; apiResult = new ApiResult(sysException.ErrorCode, getExceptionMessage(sysException)); Logger?.Warn(ex); } else { apiResult = new ApiResult(ErrorCode.UnknownError, getExceptionMessage(ex)); Logger?.Error(ex); } needRetry = false; } } } while (needRetry && retryCount-- > 0); return(apiResult); #region Old Method for .net 4 //return func().ContinueWith<Task<ApiResult>>(t => //{ // ApiResult apiResult = null; // try // { // if (t.IsFaulted) // { // throw t.Exception.GetBaseException(); // } // needRetry = false; // apiResult = new ApiResult(); // } // catch (Exception ex) // { // if (!(ex is OptimisticConcurrencyException) || !needRetry) // { // var baseException = ex.GetBaseException(); // if (baseException is SysException) // { // var sysException = baseException as SysException; // apiResult = new ApiResult(sysException.ErrorCode, sysException.Message); // } // else // { // apiResult = new ApiResult(ErrorCode.UnknownError, baseException.Message); // _logger.Error(ex); // } // needRetry = false; // } // } // if (needRetry) // { // return ProcessAsync(func, needRetry); // } // return Task.FromResult(apiResult); //}).Unwrap(); #endregion }
public static async Task <ApiResult <T> > ProcessAsync <T>(Func <Task <T> > func, bool continueOnCapturedContext = false, bool needRetry = false, int retryCount = 50, Func <Exception, string> getExceptionMessage = null) { ApiResult <T> apiResult = null; getExceptionMessage = getExceptionMessage ?? GetExceptionMessage; do { try { var result = await func().ConfigureAwait(continueOnCapturedContext); apiResult = new ApiResult <T>(result); needRetry = false; } catch (Exception ex) { if (!(ex is OptimisticConcurrencyException) || !needRetry) { var baseException = ex.GetBaseException(); if (baseException is DomainException) { var sysException = baseException as DomainException; apiResult = new ApiResult <T>(sysException.ErrorCode, getExceptionMessage(sysException)); Logger?.Warn(ex); } else { apiResult = new ApiResult <T>(ErrorCode.UnknownError, getExceptionMessage(ex)); Logger?.Error(ex); } needRetry = false; } } } while (needRetry && retryCount-- > 0); return(apiResult); #region Old Method for .net 4 /* * old method for .net 4 * return func().ContinueWith<Task<ApiResult<T>>>(t => * { * ApiResult<T> apiResult = null; * try * { * if (t.IsFaulted) * { * throw t.Exception.GetBaseException(); * } * needRetry = false; * apiResult = new ApiResult<T>(t.Result); * } * catch (Exception ex) * { * if (!(ex is OptimisticConcurrencyException) || !needRetry) * { * var baseException = ex.GetBaseException(); * if (baseException is SysException) * { * var sysException = baseException as SysException; * apiResult = new ApiResult<T>(sysException.ErrorCode, sysException.Message); * } * else * { * apiResult = new ApiResult<T>(ErrorCode.UnknownError, baseException.Message); * _logger.Error(ex); * } * needRetry = false; * } * } * if (needRetry) * { * return ProcessAsync(func, needRetry); * } * * return Task.FromResult(apiResult); * }).Unwrap(); */ #endregion }