发生异常时,如何处理C#应用程序中的退避或“等待和重试”逻辑?

时间:2013-10-15 22:34:52

标签: c# web-services rest exception webclient

我正在从REST服务中读取并需要处理“等待并重试”以查找会出现错误的大量使用的服务:

  

每秒查询次数太多

  

服务器忙碌

一般来说,由于我有许多REST服务要调用,我怎么能一般地处理发生异常时会发生的退避逻辑呢?

有没有内置的框架?我只是想编写干净的代码,不要太担心管道和基础设施。

3 个答案:

答案 0 :(得分:5)

您可以在一个处理重试逻辑的方法中将尝试包装起来。例如,如果您使用的是WebClient的异步方法:

public async Task<T> RetryQuery<T>(Func<Task<T>> operation, int numberOfAttempts, int msecsBetweenRetries = 500)
{
     while (numberOfAttempts > 0)
     {
          try
          {
               T value = await operation();
               return value;
          }
          catch
          {
                // Failed case - retry
                --numberOfAttempts;                   
          }

          await Task.Delay(msecsBetweenRetries);
     }

     throw new ApplicationException("Operation failed repeatedly");
}

然后你可以通过以下方式使用它:

// Try 3 times with 500 ms wait times in between
string result = await RetryQuery(async () => webClient.DownloadStringTaskAsync(url), 3);

答案 1 :(得分:3)

尝试并确定一次有效的活动请求数,并使用Semaphore

这是一种处理资源锁定的方法,其中资源锁定是多个相同的资源,但只有有限数量的资源。

Here's the MSDN documentation on semaphores

答案 2 :(得分:3)

我建议您查看企业库的Transient Fault Handling Application Block部分。

过去,EL的IMO过度设计并没有那么有用,但他们已采取措施解决这个问题; TFHAB是遵循更好设计指南的新块之一(同样,IMO)。