我正在尝试构建重试逻辑,并且有兴趣将代码作为参数传递。我已经搜索了一些线程,但不知何故错过了连接这里的点。
样本B完全正常,样本A开始大喊大叫'无法从用法中推断出类型参数。我第一次尝试这个请在这里请耐心等待。
下面提到了重试代码。
尝试样本A的原因是因为我希望将Foo和Bar结合起来,这样它就可以发送一个代码块来重试,而不是一次调用函数。我在这里失踪的是什么?
//SAMPLE A
Retry.Do(() => {
Foo();
Bar();
}, 120, 3);
//SAMPLE B
Retry.Do(() => Foo(), 120, 3);
public static void Do<T>(
Func<T> action,
int RetryInterval,
int RetryCount)
{
Exception LastException = null;
for (int retry = 0; retry < RetryCount; retry++)
{
try
{
Actions.FabricActions.Sleep(RetryInterval, "");
action();
return;
}
catch (Exception ex)
{
Logger.Exception(ex, "Exception encountered on retry attempt {0}", RetryCount);
LastException = ex;
}
}
if (LastException != null)
throw LastException;
}
答案 0 :(得分:2)
将签名更改为:
public static void Do(
Action action,
int RetryInterval,
int RetryCount)
{
}
Func<T>
表示您希望返回类型为T
。您没有在方法中返回任何内容,因此无法编译。如果做想要返回某些内容,请保持功能定义不变,但请确保在通话中返回,如下所示:
Retry.Do(() => {
Foo();
return Bar();
}, 120, 3);
//This is only valid because it's short hand for 'return Foo();', since you don't have { }
Retry.Do(() => Foo(), 120, 3);
// Or
Retry.Do(() => { return Foo() }, 120, 3);
// Or with method groups (only valid for sample B)
Retry.Do(Foo, 120, 3);
请注意,如果 返回值,Do
不是 - 那么您将丢弃返回值。这是否合适取决于你。但您可以更改Do
以返回T
,并执行此操作:return action();
而非action();