我在.NET 6上使用的是SignalR.NET客户端和服务器,重新连接延迟的工作方式似乎与我预期的有所不同.我在服务器上使用以下代码来定义自定义RetryPolicy:
connection = new HubConnectionBuilder()
.WithUrl(url)
.WithAutomaticReconnect(new RetryPolicy())
.Build();
public class RetryPolicy : IRetryPolicy
{
public TimeSpan? NextRetryDelay(RetryContext retryContext)
{
var delay = retryContext.PreviousRetryCount switch
{
< 5 => TimeSpan.FromSeconds(0),
< 10 => TimeSpan.FromSeconds(5),
_ => TimeSpan.FromSeconds(10),
};
Console.WriteLine($"NextRetryDelay count: {retryContext.PreviousRetryCount} elapsed: {retryContext.ElapsedTime} delay: {delay}");
return delay;
}
}
当我触发断开连接时,我得到以下输出:
NextRetryDelay count: 0 elapsed: 00:00:00 delay: 00:00:00
NextRetryDelay count: 1 elapsed: 00:00:08.1187903 delay: 00:00:00
NextRetryDelay count: 2 elapsed: 00:00:12.1619132 delay: 00:00:00
NextRetryDelay count: 3 elapsed: 00:00:16.2117377 delay: 00:00:00
NextRetryDelay count: 4 elapsed: 00:00:20.2883145 delay: 00:00:00
NextRetryDelay count: 5 elapsed: 00:00:24.3593463 delay: 00:00:05
NextRetryDelay count: 6 elapsed: 00:00:33.4387382 delay: 00:00:05
NextRetryDelay count: 7 elapsed: 00:00:42.4919265 delay: 00:00:05
NextRetryDelay count: 8 elapsed: 00:00:51.5778513 delay: 00:00:05
NextRetryDelay count: 9 elapsed: 00:01:00.6560698 delay: 00:00:05
NextRetryDelay count: 10 elapsed: 00:01:09.7329655 delay: 00:00:10
NextRetryDelay count: 11 elapsed: 00:01:23.7992479 delay: 00:00:10
NextRetryDelay count: 12 elapsed: 00:01:37.8539388 delay: 00:00:10
对于每个延迟,似乎都会有大约4秒的额外延迟,超出我在此自定义RetryPolicy中指定的时间.第二个延迟甚至还有额外的8秒,这些值看起来非常可重现,尽管不是完全可以重现.
我在这里调整了测试的实际值,但我的目标是在开始时进行几次非常快速的重试.这似乎是不可能的,因为这个从哪里冒出来的~8秒的初始延迟.
这些额外的延迟来自哪里,我如何让.NET尊重我在这里设置的RetryPolicy?