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
  • 相关阅读:
    包含游标、数组的例子
    团队开发的注意点
    养成逻辑的习惯
    C# DEV 右键出现菜单
    C#中ToString数据类型格式大全 千分符(转)
    Oracle系统查询的语句
    PLSQLDevelop 查询当前未完成的会话
    Oracle 异常工作中出现的
    Oracle 返回结果集 sys_refcursor
    DevExpress.XtraEditors.TextEdit,设定为必须number类型的。
  • 原文地址:https://www.cnblogs.com/yxcn/p/14760814.html
Copyright © 2011-2022 走看看