c# - 定期使用 SignalR (Core) 会导致线程挂起
问题描述
我们在生产中遇到了一个很难诊断的问题。症状是,当使用 SignalR 时,服务器上的一个或多个线程会定期挂起。当它发生时,其他线程似乎继续愉快,除非其中一个也遇到这个问题。
没有记录错误,但创建转储会显示线程在以下位置遇到 ObjectDisposedException:
System.Net.Sockets.SafeCloseSocket.GetOrAllocateThreadPoolBoundHandle(Boolean)
System.Net.Sockets.Socket.GetOrAllocateThreadPoolBoundHandleSlow()
System.Net.Sockets.SocketAsyncEventArgs.DoOperationSendSingleBuffer(System.Net.Sockets.SafeCloseSocket)
System.Net.Sockets.Socket.SendAsync(System.Net.Sockets.SocketAsyncEventArgs)
如果我们在客户端禁用 SignalR,则没有问题。
我们已经将 websocket 功能缩减到只创建一个空集线器的程度,但问题仍然存在。
我们使用以下命令初始化 SignalR:
services.AddSignalR();
app.UseSignalR(routes =>
{
routes.MapHub<LiveHub>("/live");
});
LiveHub.cs 的内容是:
public class LiveHub : Hub<ILiveHub>
{
public Task Ping()
{
return Clients.Caller.SendMessage("pong");
}
}
我们在应用程序负载均衡器后面的 AWS 上运行,但目前仅在一台服务器上运行。
其他人有过这个问题吗?
解决方案
推荐阅读
- ios - 动画后计算uiview的高度
- php - 更新查询正在更新每个新值并从数据库中删除以前更新的值
- python-3.x - 模型并行性不起作用?所有 GPU 都没有被使用?
- .net - 将 TLSv1 升级到 TLSv1_2016 后,通信 .NET 应用程序失败
- c++ - 从地址调用函数
- html - 为什么我的 animation-direction:alternate 不起作用?
- python - 为什么它不会将 `__get__` 转换为 `__get__.__get__`?
- gwt - 如何从 GWT 中的选定日期获取当前月份?
- php - 如何在 wordpress 中制作自定义搜索和过滤页面?
- javascript - React Router 阻止路由属性更新