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

आप अस्पताल का एक उदाहरण यह प्रयोग किया जाता है क्या है? क्या मैं इस सूची को एक सत्र में रखूंगा? – 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

सर्वर शेडिंग के मामले में इसके साथ सावधान रहें। अपने कैंटर को स्टोर करने के लिए कैश या डीबी का उपयोग करना पसंद करें। – Nigrimmist