2012-11-22 12 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からこのカウントを取得する方法はありません。ハブで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

あなたはHOSの例この使用されているがありますか?セッションでこのリストを保持しますか? – 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

サーバーシャ​​ーディングの場合は注意してください。 canterを保存するには、CacheまたはDbを使用することをお勧めします。 – Nigrimmist

関連する問題