Мне нужно проверить, подключен ли еще конкретный пользователь.
У меня есть следующий HashSet, который отслеживает пользователей:
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
Итак, отключено:
public override Task OnDisconnected()
{
UserHandler.ConnectedIds.Remove(this.Context.ConnectionId);
if (UserHandler.ConnectedIds.Count == 0)
{
// STOP TASK -> SET CANCELLATION
}
return base.OnDisconnected();
}
и на подключенном:
public override Task OnConnected()
{
Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start");
UserHandler.ConnectedIds.Add(this.Context.ConnectionId);
// start task only if at least one listener
if (UserHandler.ConnectedIds.Count < 2)
{
// START A TASK -> (WHILE LOOP THAT GETS DATA FROM DB EVERY 2 SEC)
}
return base.OnConnected();
}
Теперь проблема возникает, когда пользователь просто закрывает окно своего браузера. Я не могу узнать, отключился ли он / она.
Итак, основываясь на каком-то вопросе здесь, я бы позвонил каждому клиенту и получил ответ. Я не знаю, как это сделать.
Думаю, у меня было бы это:
public static void CheckConnectedUsers()
{
var context = GlobalHost.ConnectionManager.GetHubContext<TaskActionStatus>();
foreach (var connection in UserHandler.ConnectedIds)
{
context.Clients.Client(connection).verifyConnected("online?");
}
}
НО как мне получить ответ от клиента?
РЕДАКТИРОВАТЬ: выполняемые шаги:
Мне нужно точное количество подключенных пользователей, потому что если есть хотя бы один подключенный пользователь, мне нужно запустить задачу. И я хочу убедиться, что для всех подключенных пользователей выполняется только 1 задача ‹2 (запускать задачу). предположим такую ситуацию: 2 пользователя просматривают страницу, использующую signalR. HashSet теперь содержит 2 идентификатора, и задача выполняется. Один закрывает свой браузер, а через несколько секунд другой обновляет свой. Теперь первый (тот, который закрыл свой браузер, не выполнил метод OnDisconnected, поэтому HashSet все еще имеет свой ConnectionId, а тот, который "обновился", выполнил OnDisonnected, а затем OnConnected, который добавил его connectionId в HashSet. Поэтому вместо этого имея только 1 ConnectionId в HashSet и запуская задачу, HashSet содержит 2 (старый, больше не подключенный, и тот, который только что обновил его / ее браузер), и задача больше не запускалась.
Благодарность