2014-09-29 36 views
1

我有執行一系列任務的多線程操作。我面臨的問題是一個webservice,可能會在重壓下返回TimeoutWebException:單出TimeoutExceptions

當繁重的壓力(超時)下,我希望函數重試

Try 
{ 
    // Do some actions here 
} 
catch(WebException ex) 
{ 
    if (// Timeout) 
    { //Retry } 
    else 
    { // return error } 
} 
catch(Exception ex) 
{ //return error } 

MSDNWebexception可能會發生以下情況:

  • 中止之前調用。
  • 請求的超時期限已過期。
  • 處理請求時發生錯誤。

問題: 在我exceptionhandling,怎麼能單獨這3個原因,並挑出TimeoutExceptions不使用信息?

注:我知道我可以增加timeout來解決這個問題。但這並不能說明我的好奇心。

謝謝您的時間

+0

要選出TimeoutException,你要做一個catch(TimeoutException ex){...} – bit 2014-09-29 08:55:39

回答

1

您可以檢查Status財產相較於web request status代碼之一:

try { 

} 
catch(WebException ex) { 
    if (ex.Status == WebExceptionStatus.Timeout) { 
     // Retry logic 
    } 
    else { 
     // return error 
    } 
} 

this post見重試邏輯的一個例子。請注意,Timeout不是觸發重試的唯一原因(至少IMO也爲ConnectionFailureConnectionClosed)。

+1

你在那裏發佈的一段代碼。應該派上用場。 thnx幫助我。必須錯過領域'狀態' – User999999 2014-09-29 09:00:42

1

您可以查看異常的Status屬性,其中包含異常的正確reason

由於您使用了一些與時間相關的行爲,如果您在代碼中使用了一些測試,我會建議您查看Reactive extensions;它允許您配置事件鏈,使您可以輕鬆測試所需的行爲。看看this question的例子,我希望有一些事件可以重複發生,如果發生錯誤,頻率會更高,這可能會讓您感興趣。

+0

有趣的是,你的帖子交易有點與我們試圖實現的目標相同。 Interresting閱讀!將研究可能性'Reactive Extensions' – User999999 2014-09-29 09:04:29

相關問題