SignalR集线器客户端对象已处置

时间:2019-11-12 09:46:29

标签: c# signalr signalr-hub

我有以下带有内存连接管理的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对象会被处置?如果我等待调试器,该问题将永远不会发生。

1 个答案:

答案 0 :(得分:2)

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

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

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

  

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