【问题标题】:SignalR hub Clients object disposedSignalR 集线器客户端对象已处置
【发布时间】:2019-11-12 09:46:29
【问题描述】:

我有以下带有内存连接管理的 SignalR Hub。

[Authorize]
public class ChatHub : Hub
{
    private static readonly ConnectionMapping<string> _connections =
        new ConnectionMapping<string>();

    private readonly IMessageRepository _messagesRepository;

    public ChatHub(IMessageRepository messageRepository)
    {
        _messagesRepository = messagesRepository;
    }

    public override async Task OnConnectedAsync()
    {
        var name = Context.User.Identity.Name;
        _connections.Add(name, Context.ConnectionId);

        //await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var name = Context.User.Identity.Name;
        _connections.Remove(name, Context.ConnectionId);

        //await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
        await base.OnDisconnectedAsync(exception);
    }

    public async void SendMessage(ChatMessage chatMessage)
    {
        var name = Context.User.Identity.Name;

        var chatHistoryMessage = await _messagesRepository.SaveMessageAsync(chatMessage);

        var availableConnections = _connections.GetConnections(name);

        if (availableConnections.Any())
        {
            foreach (var connectionId in availableConnections)
            {
                Clients.Client(connectionId).SendAsync("ReceiveMessage", chatHistoryMessage);
            }
        }
        else
        {
        }
    }
}

但是,当执行代码时,下面一行

Clients.Client(connectionId).SendAsync("ReceiveMessage", 1);

Clients 上引发对象处置错误。

当我添加存储库行时,这个问题开始发生:

var chatHistoryMessage = await _messagesRepository.SaveMessageAsync(chatMessage);

SaveMessageAsync 方法:

public async Task<ChatHistory> SaveMessageAsync (ChatMessage chatMessage)
        {
            using (var conn = new SqlConnection(ConnProvider.ConnectionString))
            {
                await conn.OpenAsync();
                return (await conn.QueryAsync<ChatHistory>("[mob].[spSaveChatMessage]",
                    new
                    {
                       ..
                    },
                    commandType: CommandType.StoredProcedure)).FirstOrDefault();
            }
        }

为什么我的Clients 对象会被释放?如果我等待调试器,则该问题永远不会发生。

【问题讨论】:

  • SendMessage 不应该是async void,使用async Taskdocs.microsoft.com/en-us/archive/msdn-magazine/2013/march/…
  • 解决了。在添加存储库行之前,我没有将它作为 async,我只是添加了 async 关键字。被处置的对象是否发生是因为 SignalR 不知道我的方法 - 它是无效的?

标签: c# signalr signalr-hub


【解决方案1】:

看起来SendMessage 方法应该是async Task 而不是async void

问题可能是由 SignalR 框架运行 async voids 的方式引起的。

请参阅this article 以获得良好的概述。

返回 void 的异步方法没有提供一种简单的方法来通知 调用他们已经完成的代码。

【讨论】:

  • 感谢您的解释。问题已解决。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 2013-10-29
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2019-09-13
相关资源
最近更新 更多