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

上記のサンプルでは、​​操作を完了できないことをユーザーに通知する前に、任意の関数を取り、間隔を置いて 3 回または 4 回呼び出すことができる汎用 RetryOperation クラスを作成する方法を教えてください。

すべてのサービス呼び出し関数でコードを複製するのではなく、ジェネリック メソッドを作成できることを願っています。

C# または vb.net のサンプルは、非常に高く評価されます。

ありがとう

4

1 に答える 1

3

失敗した場合に繰り返したい呼び出しの場合は、一度に繰り返し機能を使用しないでください。サービス呼び出しが成功した場合は 1 回だけ呼び出され、サービス呼び出しが失敗した場合は 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 に答える