У меня есть ASP. NET Core 3.1 SignalR Hub.
Я хотел бы отслеживать подключенных пользователей в многопоточной среде.
Согласно Microsoft, Концентраторы временны, поэтому не следует сохранять на них какое-либо состояние.
Ниже мой класс концентратора:
public class MyHub : Hub
{
private static bool _isLocked;
private static readonly object _syncRoot = new object();
// I want to remove this state property
private static readonly List<OnlineUser> _users = new List<OnlineUser>();
public override async Task OnConnectedAsync()
{
if (!_isLocked)
{
lock (_syncRoot)
{
if (!_isLocked)
{
_isLocked = true;
_users.Add(new Online User
{
ConnectionID = Context.ConnectionId,
UserName = ""
});
_isLocked = false;
}
}
}
}
}
Я также пробовал приведенный ниже класс stati c, который будет упоминается в хабе:
public static class OnlineUsers
{
private static List<OnlineUser> Users = new List<OnlineUser>();
}
public class MyHub : Hub
{
public override async Task OnConnectedAsync()
{
// code omitted for brevity
OnlineUsers.Users.Add(new OnlineUser
{
ConnectionID = Context.ConnectionId,
UserName = ""
});
}
}
Я также нашел примеры, в которых можно использовать параллельный словарь, но это снова будет хранить состояние в хабе: private static readonly ConcurrentDictionary<string, OnlineUser> _users;
Что такое рекомендуемый способ сделать это, поскольку я не вижу никаких рекомендаций в собственной документации Microsoft, кроме того, что вам нужно отслеживать это самостоятельно.