首页 > 后端开发 > C++ > 如何在C#中优雅地实现重试逻辑?

如何在C#中优雅地实现重试逻辑?

DDD
发布: 2025-01-29 08:32:11
原创
460 人浏览过

How to Elegantly Implement Retry Logic in C#?

在 C# 中优雅地实现重试逻辑

在软件开发中,某些操作可能需要多次尝试才能成功完成。传统方法通常使用带有显式重试次数的 while 循环,例如以下代码:

int retries = 3;
while (true)
{
    try
    {
        DoSomething();
        break; // 成功!
    }
    catch
    {
        if (--retries == 0) throw;
        else Thread.Sleep(1000);
    }
}
登录后复制

这种方法虽然确保了操作会重试预定义的次数,但在不同情况下编写起来可能会比较繁琐。更通用的方法可以提供更简洁且可重用的解决方案。

引入 Retry

目标是创建一个可重用的 Retry 类,它接受一个委托作为参数,并在重试块中执行操作。以下代码提供了一种可能的实现:

public static class Retry
{
    public static void Do(Action action, TimeSpan retryInterval, int maxAttemptCount = 3)
    {
        Do(() => { action(); return null; }, retryInterval, maxAttemptCount);
    }

    public static T Do<T>(Func<T> action, TimeSpan retryInterval, int maxAttemptCount = 3)
    {
        var exceptions = new List<Exception>();

        for (int attempted = 0; attempted < maxAttemptCount; attempted++)
        {
            try
            {
                return action();
            }
            catch (Exception ex)
            {
                exceptions.Add(ex);
                if (attempted < maxAttemptCount -1)
                {
                    Thread.Sleep(retryInterval);
                }
            }
        }
        throw new AggregateException(exceptions);
    }
}
登录后复制

使用 Retry

此方法可用于各种方式来实现重试逻辑:

Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));

Retry.Do(SomeFunctionThatCanFail, TimeSpan.FromSeconds(1));

int result = Retry.Do(SomeFunctionWhichReturnsInt, TimeSpan.FromSeconds(1), 4);
登录后复制

如所示,该方法提供了一种灵活的方式来处理重试,能够指定尝试次数、重试间隔和要执行的操作。

以上是如何在C#中优雅地实现重试逻辑?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板