我有一个远程资源的调用,在这种情况下它是一个WCF,但我有一个类似的问题,可能有用的com调用。
如果抛出某些异常,我想重试该调用,并且因为有十几个调用,我想更优雅地处理它。
我想到了反思,但就像吸血鬼一样,我本能地回避它。
这就是我所拥有的
void mycall(){
for (int i = 0; i < 5; i++)
{
try
{
return this.innerProxy.LoadMap2(MapName);
}
catch (ServerTooBusyException e)
{
Logger.DebugFormat("Caught ServerTooBusyException for {0}th time but retrying [{1}]", i + 1, e.Message);
Thread.Sleep(50);
}
}
// final call will fail if ServerTooBusy is thorwn here.
return this.innerProxy.LoadMap2(MapName);
}
由于我有几个这样的调用,似乎我应该能够将方法指针和参数数组传递到这个&#39;模式中。
有什么建议吗?
答案 0 :(得分:2)
使用委托在C#中确实相对容易。您可以使用不带参数的Func<T>
,因为您可以使用lambda闭包指定一个参数数量的参数:
T Retry<T>(Func<T> method, int n) {
for (int i = 0; i < n - 1; i++) {
try {
T value = method();
return value;
} catch (ServerTooBusyException e) {
//...
}
}
//final call
return method();
}
并调用方法:
void mycall() {
var result = Retry(() => this.innerProxy.LoadMap2(MapName), 5);
}
请注意,您的mycall
会返回void
,但我认为它确实没有,因为您似乎返回了值。如果您想要返回void
,请使用Action
代替Func<T>
作为参数。