背景

在.NET中,异常是指成员没有完成它的名称宣称可以完成的行动。在异常的机制中,异常和某件事情的发生频率无关。有时候需要对一些失败的任务进行多次的重试,如果重试的次数达到我们设定的阀值,则再放弃任务。

解决方案

使用一个静态类和静态的泛型方法来处理,创建通用的任务重试机制,我们可以使用Action作为参数。

实现方法

using BQoolCommon.Service.ExtensionMethod;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace BQoolCommon.Service.Common
{public static class CommonTools{static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();static int sleepMillisecondsTimeout = 1000;/// <summary>/// 若發生 Exception (資料庫查詢逾時),重複執行相同動作/// </summary>/// <typeparam name="T"></typeparam>/// <param name="handler"></param>/// <param name="retryTimes">預設重試 3次,傳入 0直接 return default(T)</param>/// <returns></returns>public static T Retry<T>(Func<T> handler, int retryTimes = 3){if (retryTimes <= 0){return default(T);}try{return handler();}catch (Exception e){retryTimes--;logger.Error($"剩餘重試次數: {retryTimes}, retry error: {e.Message}, Exception detail: {e.ToJsonString()}");System.Threading.Thread.Sleep(sleepMillisecondsTimeout);return Retry(handler, retryTimes);}}/// <summary>/// 傳入多個動作,遇到 Exception依序執行 (資料庫查詢逾時,改用不同條件查詢)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="handlers"></param>/// <returns></returns>public static T Retry<T>(params Func<T>[] handlers){for (int i = 0; i < handlers.Length; i++){var handler = handlers[i];try{return handler();}catch (Exception e){logger.Error($"第 {i}次執行錯誤(start from 0): retry error: {e.Message}, Exception detail: {e.ToJsonString()}");System.Threading.Thread.Sleep(sleepMillisecondsTimeout);}}return default(T);}/// <summary>/// 若發生 Exception (資料庫查詢逾時),重複執行相同動作/// </summary>/// <param name="handler"></param>/// <param name="retryTimes">預設重試 3次,傳入 0直接 return</param>public static void Retry(Action handler, int retryTimes = 3){if (retryTimes <= 0){return;}try{handler();}catch (Exception e){retryTimes--;logger.Error($"剩餘重試次數: {retryTimes}, retry error: {e.Message}, Exception detail: {e.ToJsonString()}");System.Threading.Thread.Sleep(sleepMillisecondsTimeout);Retry(handler, retryTimes);}}}
}

调用方法

调用方法如下:

   public List<SystemMailModel> GetSendMailList(SystemMailSearchModel mailSearchModel){return Common.CommonTools.Retry(() => _spSystemSettingsDapperRep.GetSendMailList(mailSearchModel));}

当然,你也可以自己重载一个async的异步方法。

.NET/C#程序开发中如何更优美地实现失败任务重试的逻辑?相关推荐

  1. 项目的命名规范,为以后的程序开发中养成良好的行为习惯

    代码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 一.包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 1.s ...

  2. DevOps 在移动应用程序开发中扮演什么角色?

    作者 | VARUN BHAGAT 译者 | 火火酱,责编| Carol 封图 | CSDN 付费下载自视觉中国 全球智能手机用户数量已经超过30亿.据估计,未来几年用户人数将增加至数亿人.智能手机用 ...

  3. 程序开发中的软实力和硬实力

    概述:实力是一种客观存在,而霸权不同,霸权的基础虽然是实力,但它更是一种感知,是其他国家对他实力的感知. 一个大国,当然要积累实力,但重要的是通过战略运作,来经营国际社会对你霸权的感知.这个区别有意思 ...

  4. 微信小程序页面栈_微信小程序开发中的页面栈及页面路由原理

    摘要:小程序的开发方兴未艾,本文以图解的形式详细剖析了小程序开发中的页面栈及页面路由原理,对于该原理的深入理解有助于开发者更好地理解小程序的开发框架,更好地开发出功能强大的小程序. 微信小程序(以下简 ...

  5. AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  6. 关于微信小程序开发中遇到的缺少game.json问题的解决

    关于微信小程序开发中遇到的缺少game.json问题的解决 参考文章: (1)关于微信小程序开发中遇到的缺少game.json问题的解决 (2)https://www.cnblogs.com/ygxd ...

  7. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  8. 程序开发中 status 还是 state

    对比: 程序开发中,两个都解释为状态: status表示关联状态的转变,例如[账户]的正常.冻结.删除: state表示非关联状态的转变,例如[枚举]: 参考: 程序代码中,怎么区分status和st ...

  9. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie

    实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie 1-使用npm install axios;命令安装axios 2-新建一个文件夹再建一个.js后缀文件 ...

最新文章

  1. OpenSource的开发模式探讨
  2. 大型单细胞数据分析解决方案
  3. 【Linux】一步一步学Linux——stat命令(77)
  4. hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程
  5. div和div之间画横线_javascript – jQuery – 使用画布在div之间绘制线条
  6. ConceptDraw Office for mac(跨平台图表办公程序)
  7. 如何让网页字体文件大瘦身?前端字体优化知多D
  8. 【系统分析师之路】第十九章 复盘知识产权标准化
  9. topsis法_华北电力大学 梁海平 , 刘英培等:基于改进TOPSIS灰色关联投影法的主网网架结构评价...
  10. 纯Css比较好看的中英文字体样式(持续整理版)
  11. C语言信息学一本通题库答案,信息学奥赛一本通(C++版)在线评测系统
  12. Windows 下安装sql server 2016(附安装包资源)
  13. java截图+中文图片识别
  14. 机器学习实战(三)——决策树
  15. 水泊梁山好汉们的排名技巧
  16. Abaqus 沙漏模式
  17. 新手上路--分享20个无版权的高清图库素材网站
  18. Java调整图片大小合并PNG图片生成ICON(保持背景透明)
  19. Android项目,library中根据资源id获取资源
  20. macbook 定时提醒发送邮件

热门文章

  1. 15个变态的Google面试题以及答案
  2. 只需要2个工具,百度云盘大文件就能用迅雷和IDM下载
  3. 【Android Studio】查看源码时提示“throw new RuntimeException(Stub!)”
  4. Ant—使用Ant构建一个简单的Java工程(两)
  5. Android学习笔记(1)
  6. Win7系统中必需记住的14个常用快捷键
  7. datagrid 什么时候结束编辑_2020年中考结束后,什么时候出分?什么时候报志愿?...
  8. geek_How-To Geek正在寻找安全作家
  9. Druid源码分析系列1:dataSource.init()的准备工作
  10. 配置基于python的VIM环境