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

背景

 在.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的异步方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子商务与计算机科学与技术的相关性,电子商务、计算机科学与技术、法学等相关专业。.doc...

电子商务、计算机科学与技术、法学等相关专业。.doc优先选派专业&#xff1a;金融学、财务管理、经济学、市场营销、电子商务、计算机科学与技术、法学等相关专业。交流学校专业设置情况详见链接&#xff1a; /jwc/jxjh/zyjs.asp1、专业建设概况&#xff1a;学校已形成以经济学…

excel筛选排序从小到大_excel表格怎么按字数的多少来排列!

excel表格怎么按字数的多少来排列为了更好的做好我们的语料编定及翻译工作&#xff0c;尤其是个别语料数量较多&#xff0c;最多可达2000条。我们可以将字数少的&#xff0c;意图明确的&#xff0c;不会有异议的&#xff0c;我们可以根据每句话的字数&#xff0c;用excel来进行…

计算机系统的工作方式,某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲 - 信管网...

第2题&#xff1a;实时操作系统(RTOS)内核与应用程序之间的接口称为( )。A&#xff0e;I&#xff0f;O接口B&#xff0e;PCIC&#xff0e;APID&#xff0e;GUI答案解析与讨论&#xff1a;www.cnitpm.com/st/2867029381.html第3题&#xff1a;嵌入式处理器是嵌入式系统的核心部…

怎么从转移特性曲线上看dibl_「科普向」这篇让你快速搞懂IGBT的静态特性

IGBT的静态特性其实并非难以理解的东西,即便是对于外行人而言。刚接触那会儿&#xff0c;看到转移特性、输出特性之类的就想溜之大吉&#xff0c;加之网上查询的资料一概笼统简单&#xff0c;只描述特性曲线所表示的关系结果&#xff0c;却并不解释曲线为何这里弯曲、那里平直&…

对CORS OPTIONS预检请求的一些思考

前后端分离模大势所趋&#xff0c;跨域问题更是老生常谈。《程序员应对浏览器同源策略的姿势》一文提到三种跨域请求方案&#xff0c;重点讲述了w3c和浏览器厂商推出的CORS规范。同源策略 所谓同源是指域名、协议、端口相同。不同源的浏览器脚本(javascript、ActionScript、ca…

2020计算机单招的大专,2020专科和单招的区别

单招即单招招生是国家授权高职院校独立组织考试录取的一种方式&#xff0c;必须于高考前完成录取。众所周知&#xff0c;单招学校大部分是专科学校&#xff0c;那么&#xff0c;单招和专科有什么区别呢?下面是小编为大家收集的关于2020专科和单招的区别_选择单招有什么好处。希…

前端跨域请求get_前端实现跨域访问

1.ajax方式跨域直接使用jsonp即可dataType : "jsonp",2.使用getJson跨域获取数据$.getJSON("http://api.taobao.com/apitools/ajax_props.do&jsoncallback?",function (data) {alert(data);});执行原理&#xff1a;发送请求时需要传一个callback的回调…

如何在 ASP.NET Core 中使用 NLog 的高级特性

NLog 是一个开源的轻量级日志框架&#xff0c;提供了丰富的日志路由和管理功能&#xff0c;同时 NLog 也是非常容易的去配置和扩展&#xff0c;其实在之前的文章中我已经讨论过了 Nlog&#xff0c;在这篇我准备继续和大家讨论一下 NLog 的更多高级功能。接下来看看如何通过 .co…

计算机模拟分子设计,计算机模拟分子材料.pdf

计算机模拟分子材料.pdf计算机模拟与材料分子设计计算机模拟与材料分子设计CCCCompuomputttterer SiSiSiSimumullllaatititition anon andddd MMMMoollllecuecullllarar DDDDesesiiiigngnDalian Universityof Technology Graduate Course, Lecture 5 2010 AutumnLectureLecture…

python是用来初始化_python的初始化运行了哪些?

下面的3个print一个是在模块下面&#xff0c;一个是函数里面&#xff0c;一个是类名下面(不在方法里面)1、 运行这段代码可以发现第3行和11行可以打印出来。第7行没有打印出来。所以可以放心&#xff0c;函数或者方法里面就算有错误&#xff0c;不调用它是不可能报错的&#xf…

强烈推荐:SiteServer CMS开源免费的企业级CMS系统!

说到CMS&#xff0c;大家都知道织梦、帝国CMS、HPCMS、动易等知名老牌的&#xff01;这些东西也可以拿来就用&#xff0c;上次看到一个个人开源的cms&#xff1a;MCMS。基于SpringBoot 2架构&#xff0c;前端基于vue、element ui。每月28定期更新版本&#xff0c;为开发者提供…

计算机函数公式中怎么合并合并,Excel用函数和公式瞬间实现把表格全部合并到一个表中去...

将多张工作表汇总到一张工作表&#xff0c;这是什么意思呢&#xff1f;可以理解为把表格全部合并到一个表中去&#xff0c;之前使用VBA代码实现&#xff0c;本文将教会大家一种快速的方法&#xff0c;用函数和公式瞬间实现多表合并。例如&#xff1a;有N多个以月份命名的excel工…

permutations python_为什么Python的itertools.permutations包含重复项? (当原始列表重复时)...

为什么Python的itertools.permutations包含重复项&#xff1f; (当原始列表重复时)普遍认为&#xff0c;n个不同符号的列表有n&#xff01; 排列。 但是&#xff0c;当符号不明确时&#xff0c;在math和其他地方最常见的惯例似乎是只计算不同的排列。 因此&#xff0c;列表[1, …

. NET5一出,. NET岗面试普遍喊难,真相是…

.NET高级开发/架构师笔试题TOP101、如何设计一个高并发系统&#xff1f;2、如何实现一个.Net5 IOC框架&#xff1f;3、100W并发4G数据&#xff0c;10W并发400G数据&#xff0c;如何设计Redis存储方式&#xff1f;4、如何实现负载均衡Hash一致性算法&#xff1f;5、DotNetty能够…

计算机所有数据的表示方式都是用,计算机数据表示

1、进制1.1 进制的由来进制&#xff1a;是一种进位的方式。x进制&#xff0c;表示逢x进1。计算机的电子原件的状态&#xff1a;开&#xff0c;关。那么&#xff0c;我们表达数据的时候&#xff0c;也是按照开&#xff0c;关的状态来表示的。如果我们表达数据仅仅使用这两种昨天…

数据库年月日时分秒_数据库基本使用系列(二)

书接上回&#xff0c;上回说到数据库的发展历史&#xff0c;存储引擎以及在库层面的一些操作&#xff0c;这次来讲一下数据库中的一些基本的一些数据格式以及对表的一些操作。数据类型数据库提供的数据类型&#xff0c;包括整数类型、浮点数类型、定点数类型、位类型、日期和时…

C# 9 新特性 —— 增强的模式匹配

C# 9 新特性 —— 增强的模式匹配IntroC# 9 中进一步增强了模式匹配的用法&#xff0c;使得模式匹配更为强大&#xff0c;我们一起来了解一下吧SampleC# 9 中增强了模式匹配的用法&#xff0c;增加了 and/or/not 操作符&#xff0c;而且可以直接判断属性&#xff0c;来看一下下…

arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设

Arma3 生存服架设教程&#xff0c;武装突袭3游戏服务器架设此教程仅适用于Windows系统&#xff0c;独立服务器或者家用电脑都可以用本教程简单搭设Exile Mod。开服其实很简单, 只要你有足够的耐心&#xff01;1.首先 在你的服务器上打开steam下载ArmA 3 Server (SteamCMD 则使用…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中&#xff0c;读取这两个配置文件只需要引用System.Configuration程序集&#xff0c;分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…