2013-03-04 6 views
5

मुझे यह जांचना होगा कि कोई विशिष्ट उपयोगकर्ता अभी भी कनेक्ट है या नहीं।सिग्नलआर कनेक्ट किए गए उपयोगकर्ताओं को ट्रैक करना

मैं निम्नलिखित HashSet है कि उपयोगकर्ताओं को का ट्रैक रखता है:

public static class UserHandler 
{ 
    public static HashSet<string> ConnectedIds = new HashSet<string>(); 
} 

तो कट पर:

public override Task OnDisconnected() 
    { 
     UserHandler.ConnectedIds.Remove(this.Context.ConnectionId); 
     if (UserHandler.ConnectedIds.Count == 0) 
     { 
       // STOP TASK -> SET CANCELLATION 
     } 
     return base.OnDisconnected(); 
    } 

और पर कनेक्ट किया गया:

public override Task OnConnected() 
    { 
     Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start"); 

     UserHandler.ConnectedIds.Add(this.Context.ConnectionId); 

     // start task only if at least one listener 
     if (UserHandler.ConnectedIds.Count < 2) 
     { 
      // START A TASK -> (WHILE LOOP THAT GETS DATA FROM DB EVERY 2 SEC) 
     } 

     return base.OnConnected(); 
    } 

अब, समस्या पैदा होती है जब एक उपयोगकर्ता बस अपनी ब्राउज़र विंडो बंद कर देता है। मुझे यह जानने का कोई तरीका नहीं है कि क्या वह डिस्कनेक्ट हो गया है।

तो कुछ प्रश्न here पर आधारित, मैं प्रत्येक ग्राहक को कॉल करता हूं और प्रतिक्रिया प्राप्त करता हूं। मुझे यकीन नहीं है कि यह कैसे करें।

मुझे लगता है मैं इस होगा:

public static void CheckConnectedUsers() 
{ 
    var context = GlobalHost.ConnectionManager.GetHubContext<TaskActionStatus>(); 
    foreach (var connection in UserHandler.ConnectedIds) 
    { 
     context.Clients.Client(connection).verifyConnected("online?"); 
    } 
} 

लेकिन मैं कैसे एक प्रतिक्रिया वापस मिलता है ग्राहक के रूप में?

संपादित करें: चरणों में क्रियान्वित कर रहे हैं:

मैं क्योंकि जुड़े उपयोगकर्ताओं की सही संख्या की जरूरत है कम से कम एक उपयोगकर्ता जुड़ा मैं एक काम शुरू करने की आवश्यकता है। और मैं यह सुनिश्चित करना चाहता हूं कि सभी जुड़े उपयोगकर्ताओं के लिए केवल 1 कार्य चल रहा है < 2 (कार्य शुरू करें)। मान लीजिए इस तरह की स्थिति: 2 उपयोगकर्ता सिग्नलआर का उपयोग कर रहे एक पृष्ठ को देखते हैं। हैशसेट में अब 2 आईडी हैं और एक कार्य चल रहा है। एक अपने ब्राउज़र को बंद कर देता है और कुछ सेकंड के बाद और दूसरा उसे रीफ्रेश करता है। अब, पहला (जिसने अपने ब्राउज़र को बंद कर दिया है, वह ऑनडिस्कनेक्टेड विधि निष्पादित नहीं करता है, इसलिए हैशसेट के पास अभी भी उसका कनेक्शन आईडी है, और जिसने "रीफ्रेश" किया है, उसे ऑनडिसनेक्टेड निष्पादित किया गया था और उसके बाद कनेक्ट किया गया था, जिसने अपना कनेक्शन जोड़ा है हैशसेट में। एक HashSet में केवल 1 ConnectionId होने और एक कार्य शुरू करने की, HashSet 2 (पुराने अब और नहीं जुड़ा हुआ है और एक है कि सिर्फ उसकी/उसके ब्राउज़र ताज़ा किया), और कार्य फिर कभी नहीं शुरू हुई हैं।

धन्यवाद

उत्तर

6

सिग्नल 1.0 के साथ, OnDisconnected हमेशा आग लगाना चाहिए, भले ही उपयोगकर्ता अपनी विंडो बंद कर दें (सर्वर के पुनरारंभ होने पर इसका अपवाद)।

OnDisconnected तुरंत आग नहीं लग सकता है, क्योंकि यदि ग्राहक कनेक्शन को "निरस्त" नहीं करता है तो इसे "अशुद्ध" माना जाता है क्योंकि क्लाइंट कोशिश कर सकता है और पुनः कनेक्ट कर सकता है (और यदि आप पुनः कनेक्ट करते हैं तो आपने सिग्नलआर के अर्थशास्त्र के अनुसार डिस्कनेक्ट नहीं किया है) ।

डिफ़ॉल्ट रूप से, सर्वर को "अशुद्ध" डिस्कनेक्ट के लिए OnDisconnected पर कॉल करने में लगभग 30 सेकंड लग सकते हैं। इसे GlobalHost.Configuration.DisconnectTimeout के माध्यम से पुन: कॉन्फ़िगर किया जा सकता है।

+0

बात यह है कि मुझे जुड़े उपयोगकर्ताओं की सटीक संख्या की आवश्यकता है क्योंकि यदि कम से कम एक उपयोगकर्ता कनेक्ट है तो मुझे एक कार्य शुरू करने की आवश्यकता है। और मैं यह सुनिश्चित करना चाहता हूं कि सभी जुड़े उपयोगकर्ताओं के लिए केवल 1 कार्य चल रहा है <2 (कार्य शुरू करें)। इस स्थिति को मानें: 2 उपयोगकर्ता सिग्नलआर का उपयोग कर रहे एक पृष्ठ को देखते हैं। हैशसेट में अब 2 आईडी हैं। एक अपने ब्राउज़र को बंद कर देता है और कुछ सेकंड के बाद एक और उसे रीफ्रेश करता है। अब हैससेट में अभी भी 2 उपयोगकर्ता हैं और एक कार्य कभी शुरू नहीं होगा। मैं इसके बारे में कैसे जाउंगा ?? – ShaneKm

+0

सटीक रेपो चरण क्या हैं? – davidfowl

+0

इस तरह की मदद करता है: GlobalHost.Configuration.DisconnectTimeout। मैंने इसे अपने ग्लोबल.एक्सएक्स में 1 सेकंड पर सेट किया। धन्यवाद – ShaneKm

0

मैं बस इसी स्थिति में आया हूं। ऑनडिस्कनेक्ट हमेशा नहीं निकाल दिया जाता है। मेरा समाधान उपयोगकर्ताओं को कभी-कभी यह देखने के लिए था कि वे अभी भी जुड़े हुए हैं या नहीं।

Public Sub checkconnections() 
    For Each s In users 
     Clients.User(s).areYouThere() 
    Next 
    users = New List(Of String) 
    System.Threading.Thread.Sleep(5000) 
    checkconnections() 
End Sub 
Public Sub imHere() 
    Dim id = GetClientId() 
    If Not users.Contains(id) Then 
     users.Add(id) 
    End If 
    Clients.All.sendCount(count) 
End Sub 

इसलिए प्रत्येक 5 सेकंड हब उपयोगकर्ता सूची में सभी ग्राहकों को भेजता है और फिर सूची को साफ़ करता है।

यदि ग्राहक को 'अरे यूटरेयर' संदेश प्राप्त होता है तो यह 'imHere' के साथ जवाब देता है जो तब सूची में जोड़ा जाता है।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे