zoukankan      html  css  js  c++  java
  • c# .Net重试机制

    问题描述:某些场景下,需要对产生异常的任务或没有达到预期结果的任务进行重试,若重试次数达到了我们设定的阈值,则再放弃任务

    简单方法:

    public static void Operat(int count = 3)
    {
        //循环重试次数
        for (int i = 0; i < count; i++)
        {
            try
            {
                //执行目标方法,若无异常,则结束循环,返回
                SomeFunctionThatCanFail();
                break;
            }
            catch (Exception ex)
            {
                //若发生了异常,则打印日志,休眠5秒钟之后继续重试
                Console.WriteLine($"异常!{i}");
                Thread.Sleep(5000);
            }
        }
    }

    方案一

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

    public class Program
        {
            static void Main(string[] args)
            {
                DoAction<bool>(()=>SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1), 2);
                Console.Read();
            }
    
            public static bool SomeFunctionThatCanFail()
            {
                Console.WriteLine("方法");
                Convert.ToInt32("nihao");
                return false;
            }
    
            public static void DoAction<T>(Func<T> action, TimeSpan retryInterval, int maxAttempCount = 3)
            {
                var exceptions = new List<Exception>();
                for (int i = 0; i < maxAttempCount; i++)
                {
                    try
                    {
                        var result = action();
    
                        if (i > 0)
                            Thread.Sleep(i);
                    }
                    catch (Exception ex)
                    {
                        exceptions.Add(ex);
                    }
                }
            }
        }
    View Code

    方案二

    使用第三方组件,eg:Polly,Polly是一个任务重试解决方案组件,用Polly你可以非常方便地完成如:Retry,Retry Forever,Wait and Retry或者Circuit Breaker等等重试操作,并且Polly的重试写法是链式的,如:

     方案三

    以下方法可以在重试失败时补充异常处理方法

    public class Program
        {
            static void Main(string[] args)
            {
                DoAction(()=> SomeFunctionThatCanFail(), ()=> Log(),3);
                Console.Read();
            }
    
            public static bool SomeFunctionThatCanFail()
            {
                Console.WriteLine("进入任务内容");
                Convert.ToInt32("nihao");
                return false;
            }
    
            public static void Log()
            {
                Console.WriteLine("产生异常!");
            }
    
            public static void DoAction<T>(Func<T> action,Action OnFailureAction, int maxAttempCount = 3)
            {
                var exceptions = new List<Exception>();
                for (int i = 0; i < maxAttempCount; i++)
                {
                    try
                    {
                        var result = action();
    
                        if (i > 0)
                            Thread.Sleep(i);
                    }
                    catch (Exception ex)
                    {
                        OnFailureAction();
                    }
                }
            }
        }
    View Code
  • 相关阅读:
    1.RabbitMQ简介
    有这样一个需求 element +vue 实现显示的table 的表头添加一个添加图标, 并绑定一个点击事件,我查了好多资料, 终于找到table 表头的一个事件 :render-header 可以实现。
    原生的html js 做的文件上上传
    elment + vue 文件上传
    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
    mysql 数据库迁移 sql server (沃尔玛)
    quartz 浅谈 Scheduler
    quartz CronTrigger的cron表达式 详解:
    Linux中的一些常用命令
    类图中常用的六种关系
  • 原文地址:https://www.cnblogs.com/yxcn/p/14760814.html
Copyright © 2011-2022 走看看