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

本文关键字:等待 逻辑 等待并重试 重试 应用程序 异常 何处理 处理 | 更新日期: 2023-09-27 18:35:26

我正在从 REST 服务读取,需要处理"等待并重试"以处理一个频繁使用的服务,这会给我一个错误:

每秒查询次数过多

服务器繁忙

一般来说,由于我有许多 REST 服务要调用,因此我通常如何处理发生异常时会发生的退避逻辑?

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

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

您可以将尝试包装在为您处理重试逻辑的方法中。 例如,如果您使用的是 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);

尝试确定一次可以活动多少个活动请求并使用Semaphore

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

下面是有关信号量的 MSDN 文档

我建议您查看企业库中的暂时性故障处理应用程序块。

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