【发布时间】: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 Task。 docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/… -
解决了。在添加存储库行之前,我没有将它作为 async,我只是添加了 async 关键字。被处置的对象是否发生是因为 SignalR 不知道我的方法 - 它是无效的?
标签: c# signalr signalr-hub