WebException:单独输出TimeoutExceptions

时间:2014-09-29 08:52:25

标签: c# asp.net .net multithreading

我有多线程操作,执行一系列任务。我面临的问题是网络服务,在压力很大的情况下可能会返回Timeout

当处于沉重压力(超时)时,我希望该功能重试

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

来自MSDN在以下情况下可能会发生Webexception

  • Abort之前被称为。
  • 请求的超时期限已过期。
  • 处理请求时出错。

问题: 在我的异常处理中,如何分离这三个原因并单独输出TimeoutExceptions而不使用该消息?

注意:我知道我可以增加timeout来解决问题。但这并不能使我好奇。

感谢您的时间

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以查看异常的Status属性,该属性将包含异常的reason

由于您正在使用某些与时间相关的行为,如果您在代码中使用某些测试,我建议您查看Reactive extensions;它允许您配置允许您轻松测试所需行为的事件链。请查看this question以获取一些示例,其中我希望某些事件重复发生的频率更高,以防您感兴趣。