有效随意调用优雅重试

时间:2014-10-13 12:47:24

标签: c# .net

我有一个远程资源的调用,在这种情况下它是一个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;模式中。

有什么建议吗?

1 个答案:

答案 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>作为参数。