2012-09-15 103 views
0

我想弄清楚是否有一個簡單的方法,當它發送錯誤時執行服務的重試。上述樣品我怎樣才能使可採取任何功能並調用它具有間隔3或4倍,通知該操作不能完成用戶之前的通用RetryOperation類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 func/class 

RetryOperation(...) 

End Try 

End Function 

:讓說對於例如。

我希望它可以使一個通用的方法,而不是有重複的代碼在所有的服務通話功能

在C#或vb.net任何樣品將非常感激。

感謝

回答

2

如果,如果,爲什麼不馬上使用重複功能,如果服務調用成功,如果服務調用失敗,它只會被調用一次,失敗了你可能要重複呼叫將重試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 
+0

感謝您的答覆,我是有點糊塗了,是你通過dafult建議調用RepeatCall,然後發送異常?我想要的是客戶端函數將調用服務函數,如果它引發異常,則只應調用RepeatCall。還是我完全誤解了你的建議? – melspring

+0

我更新了我的答案,上面看到,沒有什麼能夠阻止您使用我的代碼示例執行您在問題中描述的內容,我只是描述了我使用的一種方法。通過這種方式,您可以將重試邏輯放入RepeatCall方法中,而不是將其重複用於每次服務調用。 –

+0

再次感謝,這是有道理的,並消除方法catch-throw。只是想知道RepeatCall是否可以在自己的線程上運行?你有什麼建議嗎? – melspring