我目前正在进行指数衰减(http://www.acodersjourney.com/2016/02/26-handle-transient-errors-in-c/)实施。
我计算等待的延迟,这样:
var delay = (int) Math.Round(Math.Pow(timeBetweenAttempts, attempt), MidpointRounding.AwayFromZero);
显然,这种延迟开始变得非常大,非常快,即使尝试之间的时间是10毫秒。
我希望能够做类似的事情:
var maxTimeBetweenAttempts = 5000; // 5 seconds is the hard limit
var nominalTimeBetweenAttempts = 10;
var maxNumberOfAttempts = // calculate the maximum number of raises that would hold below 5000.
显然这可以使用循环来计算,但我想知道是否有更优雅的方法来做到这一点?
答案 0 :(得分:0)
取幂的倒数是对数,所以你可以使用它。 你会用
if (attempt < Math.Log(maxTimeBetweenAttempts) / Math.Log(nominalTimeBetweenAttempts))
{
Retry(++attempt);
}
在四舍五入后查看尝试是否低于阈值。
然而,由于这需要额外的计算并且稍微不那么明显(因为它使用对数数学,大多数人自学校以来没有看过事件)而不仅仅是指数,我个人建议只计算功率和测试这一点。
即
if(Math.Pow(nominalTimeBetweenAttempts, attempt) < maxTimeBetweenAttempts)
{
Retry(++attempt);
}
修改强>
重新阅读您的问题,您明确声明您想知道在达到一定长度之前的最大重试次数。那将是:
var maximumNumberOfAttempts = Math.Floor(Math.Log(maxTimeBetweenAttempts) / Math.Log(nominalTimeBetweenAttempts))