2014-09-29 66 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

相关问题