当前位置: 首页 > news >正文

C# 中的Retry 模型

场景:
在另一个线程中,指定失败次数,不断重试直到得到期望结果。


工具类:
public class Retry
{
	public static Retry Instance(){
		return new Retry();
	}
	
    public TResult Execute<TResult>(
	Func<TResult> action,
	int secondsInterval,
	int retryCount,
	TResult expectedResult,
	bool isSuppressException = true
      )
    {
       TResult result = default(TResult);


       var exceptions = new List<Exception>();
	   	for (var retry = 0; retry < retryCount; retry++)
        {
			try
			{
				if (retry > 0){
					Thread.Sleep(secondsInterval * 1000);
				}
				
				result = action();
				Console.WriteLine(string.Format("executing {0} times, result : {1}",retry+1,result));
			}
			catch (Exception ex)
			{
				exceptions.Add(ex);
			}
	
			if (result.Equals(expectedResult)){
					return result;
			}
		}
	
		if (!isSuppressException){
			throw new AggregateException(exceptions);
		}   
		else{
			return result;
		}
   }
}






使用示例:
void Main()
{
	try{
		var expected = 5;
		var retryCount = 10;
		var ret = Retry.Instance().Execute<int>(()=>{var r = new Random(); return r.Next(10);},1,retryCount,expected);
		if(expected == ret)
			Console.WriteLine("done. got result : " + ret);
		else
			Console.WriteLine("tried {0} times , failed to get expected result : {1}",retryCount,expected);
	}
	catch (Exception ex){
		Console.WriteLine(ex.Message);
	}
}


相关文章:

  • Apple应用消息通知 swift前端c#后端
  • MySQL数据库灾难恢复
  • 使用C# Diagnostics.DebuggerDisplay属性提高调试信息可读性
  • PDI简单介绍之ETL工具-----spoon
  • python flask web环境配置步骤
  • python flask SQLAlchemy 的用法
  • Blog须知
  • Azure VM Scalable Sets -- 适用IAAS架构
  • 数据库设计技巧14则
  • 一张图说明HTTPS 握手过程
  • linux-2.6.26内核中ARM中断实现详解(1)
  • 创建Azure scheduler完成日常任务
  • (TipsTricks)用客户端模板精简JavaScript代码
  • eclipse 生成发布的apk (signed zipalign过程)
  • 使用黄金分割比值计算斐波那契数列
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android优雅地处理按钮重复点击
  • css属性的继承、初识值、计算值、当前值、应用值
  • Druid 在有赞的实践
  • E-HPC支持多队列管理和自动伸缩
  • golang中接口赋值与方法集
  • node-glob通配符
  • scala基础语法(二)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Swoft 源码剖析 - 代码自动更新机制
  • windows下如何用phpstorm同步测试服务器
  • 对象管理器(defineProperty)学习笔记
  • 记录:CentOS7.2配置LNMP环境记录
  • 理清楚Vue的结构
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 删除表内多余的重复数据
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 双管齐下,VMware的容器新战略
  • 算法-插入排序
  • 异步
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​TypeScript都不会用,也敢说会前端?
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (小白学Java)Java简介和基本配置
  • (转)我也是一只IT小小鸟
  • .cfg\.dat\.mak(持续补充)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [ACM] hdu 1201 18岁生日
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [bzoj 3534][Sdoi2014] 重建