我在.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?

推荐答案

当您实现一个定制的IRetryPolicy时,您必须考虑到您输入的delayHubConnectionBuilder在try 重新连接之前所花费的时间相加.

因此,假设您的SignalR客户端在返回重新连接不可能之前重试4秒,并加上您设置的delay秒,您将得到所用的时间.

try 重新连接所花费的4秒+5秒延迟=将之前经过的时间增加9秒.

知道你可以把你的delay秒改得更短(或者不改),这样等待时间就会更快.

我在一个需要大约21秒重新连接的客户端上try 了这种行为,并增加了5秒的延迟,得到了稳定的26秒等待时间,所以RetryPolicy工作得很好.

NextRetryDelay count: 0 elapsed: 00:00:00 delay: 5
NextRetryDelay count: 1 elapsed: 00:00:26.1568207 delay: 5
NextRetryDelay count: 2 elapsed: 00:00:52.2934825 delay: 5
NextRetryDelay count: 3 elapsed: 00:01:18.3989711 delay: 5
NextRetryDelay count: 4 elapsed: 00:01:44.5205752 delay: 5
NextRetryDelay count: 5 elapsed: 00:02:10.6291636 delay: 5
NextRetryDelay count: 6 elapsed: 00:02:36.7462710 delay: 5
NextRetryDelay count: 7 elapsed: 00:03:02.8838054 delay: 5
NextRetryDelay count: 8 elapsed: 00:03:29.0223075 delay: 5
NextRetryDelay count: 9 elapsed: 00:03:55.1337186 delay: 5
NextRetryDelay count: 10 elapsed: 00:04:21.2564770 delay: 5

Csharp相关问答推荐

WeakHandle .NET核心与.NET框架

在C#c/await中,延迟长度是否会影响控制返回调用者?

如何定义所有项目的解决方案版本?

无法从具有一对多关系的C#类中使用Swagger创建记录

在命令行中使用时安装,但在单击时不会安装

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

MS Graph v5.42.0:在寻呼消息时更改页面大小

MigraDoc文档

由于POST中的应用程序/JWT,出现不支持的内容类型异常

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

无法使用[FromForm]发送带有图像和JSON的多部分请求

在ASP.NET Core 8 MVC中本地化共享视图

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

JsonPath在Newtonsoft.Json';S实现中的赋值

如何使用Npgsql从SELECT获得所有查询结果

映射器-如何映射到多个实体

C#定时器回调对象上下文?