Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务重试_C#_Vb.net_Wcf - Fatal编程技术网

C# WCF服务重试

C# WCF服务重试,c#,vb.net,wcf,C#,Vb.net,Wcf,我试图弄清楚,当服务发送错误时,是否有一种简单的方法来实现重试。比如说: 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

我试图弄清楚,当服务发送错误时,是否有一种简单的方法来实现重试。比如说:

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中的任何示例都将非常感谢


谢谢

如果这是一个呼叫,如果失败,您可能希望重复,为什么不立即使用重复功能,如果服务呼叫成功,它将只被调用一次,如果服务呼叫失败,它将重试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
        }
     }
 }
在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

如果这是一个调用,如果失败,您可能希望重复,为什么不立即使用重复功能,如果服务调用成功,它将只被调用一次,如果服务调用失败,它将重试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
        }
     }
 }
在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

感谢您的回复,我有点困惑,您是否建议dafult调用RepeatCall,然后它发送异常?。我想要的是客户机函数将调用服务函数,如果它抛出异常,则只应调用RepeatCall。还是我完全误解了你的建议?我更新了我的答案见上文,使用我的代码示例,没有任何东西阻止你做你在问题中描述的事情,我刚刚描述了我使用的一种方法。通过这种方式,您可以将重试逻辑放在RepeatCall方法中,而不是为每个服务调用复制它。再次感谢,这确实有意义,并且消除了重新编写catch-throw-in方法。只是想知道RepeatCall是否可以在自己的线程上运行?您有什么建议吗?当然,这取决于您的需求,也就是说,您的代码是否需要了解servicecall是如何进行的?在这种情况下,您需要某种类型的同步。我想我会将线程放在RepeatCall方法中,并添加一些回调类型,以便主线程可以获得操作的最终结果(成功或失败)。感谢您的回复,我有点困惑,您是否建议dafult调用RepeatCall,然后它发送异常?。我想要的是客户机函数将调用服务函数,如果它抛出异常,则只应调用RepeatCall。还是我完全误解了你的建议?我更新了我的答案见上文,使用我的代码示例,没有任何东西阻止你做你在问题中描述的事情,我刚刚描述了我使用的一种方法。通过这种方式,您可以将重试逻辑放在RepeatCall方法中,而不是为每个服务调用复制它。再次感谢,这确实有意义,并且消除了重新编写catch-throw-in方法。只是想知道RepeatCall是否可以在自己的线程上运行?您有什么建议吗?当然,这取决于您的需求,也就是说,您的代码是否需要了解servicecall是如何进行的?在这种情况下,您需要某种类型的同步。我想我会将线程放在RepeatCall方法中,并添加一些回调类型,以便主线程可以获得操作的最终结果(成功或失败)