gpt4 book ai didi

c# - SignalR hub 客户端对象被释放

转载 作者:行者123 更新时间:2023-11-30 22:51:49 25 4
gpt4 key购买 nike

我有以下带有内存中连接管理的 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 Task 而不是 async void

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

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

Async methods returning void don’t provide an easy way to notify the calling code that they’ve completed.

关于c# - SignalR hub 客户端对象被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com