需要帮助重构重试逻辑模式

时间:2016-12-23 09:30:36

标签: c# generics

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

目前我正在使用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
  }
}

我想实现类似于下面的Generic方法,我可以调用一次,它将负责重试逻辑实现。而不是异常处理我想从串口查询响应。

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);
            }

例如:int returnCount = Do(MyMethod,TimeSpan.FromMilliSeconds(300),3);

我如何实现这一目标?

0 个答案:

没有答案