Obtenir le nombre d'auditeurs, les clients connectés à SignalR hub
Est-il possible de connaître le nombre d'auditeurs (les clients connectés à un hub?)
j'essaie d'exécuter / démarrer une tâche si au moins un client est connecté, sinon ne la démarrez pas:
[HubName("taskActionStatus")]
public class TaskActionStatus : Hub, IDisconnect
{
static CancellationTokenSource tokenSource;
public void GetTasksStatus(int? siteId)
{
tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;
ITaskRepository taskRepository = UnityContainerSetup.Container.Resolve<ITaskRepository>();
// init task for checking task statuses
var tasksItem = new DownloadTaskItem();
taskRepository.GetTasksStatusAsync(siteId, tasksItem, ct);
// subscribe to event [ listener ]
tasksItem.Changed += new EventHandler<TaskEventArgs>(UpdateTasksStatus);
}
public void UpdateTasksStatus(object sender, TaskEventArgs e)
{
Clients.updateMessages(e.Tasks);
}
// when browsing away from page
public Task Disconnect()
{
try
{
tokenSource.Cancel();
}
catch (Exception)
{
//
}
return null;
}
}
merci
38
demandé sur
Ogglas
2012-11-22 17:57:02
3 réponses
il n'y a aucun moyen d'obtenir ce compte de SignalR en tant que tel. Vous devez utiliser le OnConnect()
et OnDisconnect()
méthodes sur le Hub pour garder le compte vous-même.
exemple Simple avec une classe statique pour tenir le comte:
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
public class MyHub : Hub
{
public override Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected()
{
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnected();
}
}
vous obtenez alors le compte de UserHandler.ConnectedIds.Count
.
67
répondu
Anders Arpi
2014-06-03 08:03:20
Pour la version 2.1.1+, il devrait être:
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
public class MyHub : Hub
{
public override Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
}
23
répondu
Ogglas
2015-09-25 15:31:29
Maintenant, vous avez besoin de:
public override Task OnConnectedAsync()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(Exception exception)
{
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnectedAsync(exception);
}
0
répondu
ejdrian313
2018-10-09 17:56:59