可能重复:
C#最简单的写入重试逻辑的方法?
我有一个功能包含服务器的Web服务调用,由于网络中的一些干扰,有时会失败(无法连接远程服务器错误).代码在try catch块中.我想在try块中重新运行Web服务调用,以便成功完成Web调用.
我需要重试一个特定的方法,直到它返回一个非空的Guid.
有一个很棒的答案,根据是否有异常重试; 但是,我想概括这个类能够处理任何指定的条件.
当前用法将执行特定次数的操作,直到没有例外:
Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));
Run Code Online (Sandbox Code Playgroud)
要么:
Retry.Do(SomeFunctionThatCanFail, TimeSpan.FromSeconds(1));
Run Code Online (Sandbox Code Playgroud)
要么:
int result = Retry.Do(SomeFunctionWhichReturnsInt, TimeSpan.FromSeconds(1), 4);
Run Code Online (Sandbox Code Playgroud)
如何修改此类,使其根据我传入的函数的返回值重试?
例如,如果我想重试,直到我的函数返回3:
Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1)).Until(3);
Run Code Online (Sandbox Code Playgroud)
这意味着每1秒执行一次SomeFunctionThatCanFail(),直到SomeFunctionThatCanFail()= 3?
在满足条件之前,我如何概括Retry.Do的用法?
public static class Retry
{
public static void Do(
Action action,
TimeSpan retryInterval,
int retryCount = 3)
{
Do<object>(() =>
{
action();
return null;
}, retryInterval, retryCount);
}
public static T Do<T>(
Func<T> action,
TimeSpan retryInterval,
int retryCount = 3)
{
var exceptions = new List<Exception>();
for (int retry = 0; …Run Code Online (Sandbox Code Playgroud) 我在完成重试逻辑代码时遇到了一些麻烦。但是,我无法找出缺失的部分。当失败时如何捕获并记录并使用计时器再次重试。
这是我的代码。
while (true)
{
var res = await this.httpClientWrapper.......
if (res.IsSuccessStatusCode)
{
var result = await res.Content.......
this.logger.Info($".......
}
if (result.status == "Succesed")
{
return true;
}
else
{
var resContent = await.......
this.logger.Info($.......
await Task.Delay(2000).ConfigureAwait(false);
throw new Exception(resContent);
}
}
Run Code Online (Sandbox Code Playgroud) Is it possible to create a method/extension to try-catch a piece of code within some brachets? For example:
public static void TryCatchrep(//CODEHERE)
{
bool t;
do
{
try
{
//CODEHERE
t = true;
}
catch
{
//ERROR
t = false;
}
} while (t == false); //Repeats on catch
}
Run Code Online (Sandbox Code Playgroud)