gpt4 book ai didi

c# - 编写重试逻辑的最简洁方法?

转载 作者:IT王子 更新时间:2023-10-29 03:27:38 25 4
gpt4 key购买 nike

有时我需要在放弃之前重试几次操作。我的代码是这样的:

int retries = 3;
while(true) {
try {
DoSomething();
break; // success!
} catch {
if(--retries == 0) throw;
else Thread.Sleep(1000);
}
}

我想在一般的重试函数中重写它,例如:

TryThreeTimes(DoSomething);

在 C# 中可以吗? TryThreeTimes() 方法的代码是什么?

最佳答案

如果用作一般异常处理机制,简单地重试相同调用的一揽子 catch 语句可能很危险。话虽如此,这里有一个基于 lambda 的重试包装器,您可以将其与任何方法一起使用。我选择将重试次数和重试超时作为参数考虑在内,以获得更大的灵 active :

public static class Retry
{
public static void Do(
Action action,
TimeSpan retryInterval,
int maxAttemptCount = 3)
{
Do<object>(() =>
{
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
{
if (attempted > 0)
{
Thread.Sleep(retryInterval);
}
return action();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
throw new AggregateException(exceptions);
}
}

您现在可以使用此实用程序方法来执行重试逻辑:

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

或:

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

或:

int result = Retry.Do(SomeFunctionWhichReturnsInt, TimeSpan.FromSeconds(1), 4);

或者您甚至可以进行 async 重载。

关于c# - 编写重试逻辑的最简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com