예제 #1
0
        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
        }
예제 #2
0
        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
        }