C# 重构重试逻辑模式需要帮助吗

C# 重构重试逻辑模式需要帮助吗,c#,generics,C#,Generics,我想向串行端口发送一些命令并侦听响应。 来自端口的响应可能是格式良好的数据或损坏的数据。在这种情况下,我必须在策略超时后重试发送相同的命令 目前,我正在使用while循环来实现这一点。然而,我正在寻找一种更简单和可重用的方法,用于我需要发送的所有~30个命令 int retryCount = 3; while(retryCount > 0){ _SerialPort.WriteLine("$0\r"); Thread.Sleep(300); //Check response

我想向串行端口发送一些命令并侦听响应。 来自端口的响应可能是格式良好的数据或损坏的数据。在这种情况下,我必须在策略超时后重试发送相同的命令

目前,我正在使用while循环来实现这一点。然而,我正在寻找一种更简单和可重用的方法,用于我需要发送的所有~30个命令

int retryCount = 3;

while(retryCount > 0){
 _SerialPort.WriteLine("$0\r");
 Thread.Sleep(300);

 //Check response 
 RESPONSE_STATE iResponse = ProcessResponse();
 if (iResponse == RESPONSE_STATE.NOERROR)
  {
     //process response
     break;
  }
  else
  {
     retryCount--;
     //repeat operation
  }
}
我想实现一个类似于下面的通用方法,我可以调用一次,它将负责重试逻辑实现。我想查询来自串行端口的响应,而不是异常处理

public T Do<T>(Func<T> action, TimeSpan retryInterval, int retryCount = 3)
            {
                var exceptions = new List<Exception>();
                for (int retry = 0; retry < retryCount; retry++)
                {
                    try
                    {
                        if (retry > 0)
                            Thread.Sleep(retryInterval);
                        return action();
                    }
                    catch (Exception ex)
                    {
                       exceptions.Add(ex);
                    }
                }
                throw new AggregateException(exceptions);
            }
public T Do(Func操作,TimeSpan retryInterval,int retryCount=3)
{
var exceptions=新列表();
for(int retry=0;retry0)
睡眠(重试区间);
返回动作();
}
捕获(例外情况除外)
{
例外情况。添加(ex);
}
}
抛出新的AggregateException(异常);
}
例如:
intreturncount=Do(MyMethod,TimeSpan.frommilluses(300),3)


如何实现这一点?

问题是什么?您的解决方案应该可以工作我如何修改此重试逻辑以调用基于ProcessResponse()的方法,而不是在出现异常时调用Check out polly: