首页 > 解决方案 > 定期使用 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 上运行,但目前仅在一台服务器上运行。

其他人有过这个问题吗?

标签: c#websocket.net-coresignalrasp.net-core-signalr

解决方案


推荐阅读