2012-11-22 90 views
33

有没有办法找出听众(客户端连接到集线器?)我试图运行数获取听众,客户端连接到SignalR枢纽的数

/启动任务如果至少一个客户端连接,否则不启动它:

[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; 
    } 
} 

感谢

回答

60

没有办法摆脱SignalR这样算不算这样。您必须使用Hub上的OnConnect()OnDisconnect()方法来自行保持计数。

与静态类简单的例子来保持计数:

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(); 
    } 
} 

然后,从UserHandler.ConnectedIds.Count得到计数。

+0

你有这是用来居屋的例子吗?我会在会议中保留这个清单吗? – ShaneKm

+0

通常最好是在某些类型的数据存储(可能只是一个静态类)中保持服务器上的计数。我可以在我的答案中概述解决方案,给我一分钟... –

+5

+1只记得在应用程序域重新启动时,对象将被重置;你应该考虑在某个时候坚持这个对象;我通常每当有人被添加或删除时都会这样做。 – f0x

22

为2.1.1+的版本应该是:

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); 
    } 
} 
+1

服务器分片时要小心。倾向于使用Cache或Db来存储您的跑步。 – Nigrimmist