我编写了一个从Web服务调用多个方法的C#应用程序。从Main中的循环,某些类中的循环调用方法,依此类推。由于相同的原因,这些方法中的每一种都可能失败:
如果这些方法中的任何一个失败,我只需要等待几秒钟(或调用登录方法),然后再次调用它们。
我不想为每个调用所有这些方法编写基本相同的try / catch块,所以我需要另一个通用方法,它可以调用所有其他方法而不考虑它的名称和参数,然后捕获一些常见的异常,必要时再次调用该方法,并返回值。
方法授权响铃,但我真的不知道如何解决这个问题。任何帮助将不胜感激。
答案 0 :(得分:3)
听起来你可能想要这样的东西:
private T CallWithRetries<T>(Func<T> call)
{
// TODO: Work out number of retries, etc.
for (int i = 0; i < 3; i++)
{
try
{
return call();
}
catch (FooException e)
{
// Determine whether or not to retry, log etc. If this is the
// last iteration, just rethrow - or keep track of all the exceptions
// so far and throw an AggregateException containing them.
}
}
throw new InvalidOperationException("Shouldn't get here...");
}
然后:
// Or whatever you want to do...
int userId = CallWithRetries(() => webService.GetUserId(authentication));
对于任何不返回值的调用,您可以使用Action
参数的类似方法。
答案 1 :(得分:1)
您可以创建如下方法:
private void CallWebMethod(Action methodToBeCalled)
{
try
{
methodToBeCalled();
}
catch (Exception ex)
{
//Log exception
}
}
使用以下方法调用没有任何参数的方法:
CallWebMethod(someMethod);
使用参数调用方法:
CallWebMethod(() => someMethodWithArgument(args));