0

我试图弄清楚是否有一种简单的方法可以在发送故障时实现对服务的重试。让我们说例如:

Private Function SaveEmployee(emp as Empoyee)
Try
...
returnval = service.SaveEmployee(emp)
Catch ex as exception
'if exception requires retry eg:end point not found or database is not responding then
'call retry  func/class

RetryOperation(...) 

End Try

End Function

在上面的示例中,如何创建一个通用的 RetryOperation 类,它可以采用任何函数并在通知用户操作无法完成之前每隔一段时间调用它 3 或 4 次。

我希望可以制作一个通用方法,而不是在所有服务调用函数中都有重复的代码

C# 或 vb.net 中的任何示例将不胜感激。

谢谢

4

1 回答 1

3

如果它是一个你可能想要重复的调用,如果它失败为什么不立即使用重复功能,如果服务调用成功,它只会被调用一次,如果服务调用失败,它将重试 x 次,如果它第 x 次失败,它将引发异常

像这样的东西怎么样,请注意这大大简化了,您需要添加错误处理等:

像这样创建您的重复方法:

private void RepeatCall(int numberOfCalls, Action unitOfWork)
{
    for (int i = 1; i <= numberOfCalls; i++)
        {
        try
        {
            unitOfWork();
        }
        catch (...)
        {
            // decide which exceptions/faults should be retried and 
            // which should be thrown
            // and always throw when i == numberOfCalls
        }
     }
 }

像这样使用它

try
{
    RepeatCall(3, () => 
                    {
                         MyServiceCall();
                    });

}
catch(....)
{
   // You'll catch here same as before since on the last try if the call
   // still fails you'll get the exception
}

在 VB.NET 中也是一样的

Private Sub RepeatCall(ByVal numberOfCalls As Integer, ByVal unitOfWork As Action)

    For i = 1 To numberOfCalls
        Try
            unitOfWork()
        Catch ex As Exception

        End Try
    Next

End Sub

用它:

  Try
      RepeatCall(3, Sub()
                       MyServiceCall()
                    End Sub)

  Catch ex As Exception

  End Try
于 2012-09-15T05:10:16.940 回答