2012-11-22 127 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