2014-07-17 8 views
5

भेजें, मैंने आज देखा कि मेरा एक एप्लीकेशन जो विकास कर रहा है वह स्मृति में गंभीरता से बढ़ रहा है। तो मैं एक दृश्य स्टूडियो मेमोरी प्रोफ़ाइल किया था और मैं निम्नलिखित परिणाम नहीं मिला:एसिंक सॉकेट के साथ मेमोरी इश्यू और

Function Name Inclusive Allocations Exclusive Allocations Inclusive Bytes Exclusive Bytes 
System.Net.Sockets.Socket.BeginSend(uint8[],int32,int32,valuetype System.Net.Sockets.SocketFlags,valuetype System.Net.Sockets.SocketError&,class System.AsyncCallback,object) 3 192 569 3 192 561 635 307 885 635 307 621 

यह ~ 600Meg साथ स्मृति के उपयोग की चोटी पर था

यह does not मेरे लिए सही लगते हैं और सुनिश्चित नहीं हैं कि im कारण है कि यह ऐसा है?

यहाँ मेरी भेजने समारोह है:

private void SendSignal(Byte[] signal) 
    { 
     if (state.WorkSocket.Connected) 
     { 
      try 
      { 
       state.WorkSocket.BeginSend(signal, 0, signal.Length, 0, new AsyncCallback(SendCallback), state.WorkSocket); 
      } 
      catch (Exception e) 
      {      
       log.Error("Transmission Failier for ip: " + state.WorkSocket.AddressFamily , e); 
      } 
     } 
     else 
     { 
      CloseConnection(); 
     } 
    } 

भेजने के लिए संदेश के साथ एक समवर्ती कतार, और पर आवेदन ब्लॉक जब यह सफलतापूर्वक संदेश यह सभी पंजीकृत (क्लाइंट) के माध्यम से लूप dequeues और को यह संदेश भेजता है उन्हें।

क्या मैं शुरुआत से गलत प्रेषण का उपयोग कर रहा हूं?

एक बात जो मैं हालांकि, यह तथ्य है कि यह async है, क्या मेरा प्रोग्राम पूरे कतार के माध्यम से लूप हो सकता है और इसे सभी को एसिंक सिस्टम बफर में ऑफ़लोड कर सकता है?

{संपादित}

private void SendCallback(IAsyncResult asyncResult) 
    { 
     try 
     { 
      Socket handler = (Socket)asyncResult.AsyncState; 
      int bytesSent = handler.EndSend(asyncResult); 
      if (bytesSent == 0) 
      { 
       CloseConnection(); 
       return; 
      } 
     } 
     catch 
     { 
      CloseConnection(); 
     } 
    } 

वे आई सी कतार

ExponentialBackoff eb = new ExponentialBackoff(); 
     while (run) 
     { 
      //Fetch Latest Item 
      ILogItem logItem; 
      if (incomingQueue.TryDequeue(out logItem)) 
      { 
       //Handle the logItem 
       SendEventToObservers(logItem); 
       //Reset the exponetial backoff counter 
       eb.reset(); 
      } 
      else 
      { 
       //Exponential backoff thread sleep 
       eb.sleep(); 
      } 
     } 

private void SendEventToObservers(ILogItem item) 
    { 
     foreach (var observer in registeredObservers.ToList()) 
     { 
      if (observer != null) 
      { 
       observer.OnMessageRecieveEvent(new ObserverEvent(item)); 
       // This just calls private void SendSignal(Byte[] signal) 
      } 
     } 
    } 
+2

कॉलबैक पोस्ट करें और जिस तरह से आप कतार को हटाते हैं। – usr

+0

@usr होन :) उम्मीद है कि – Zapnologica

उत्तर

1

नाली प्रत्येक कतार आइटम आप एक अतुल्यकालिक भेजने जारी करने के लिए। इसका मतलब है कि प्रेषण की असंबद्ध संख्या लंबित हो सकती है। संसाधन का उपयोग असंबद्ध है। आम तौर पर, आप एक भेजना जारी करेंगे और पिछले एक के बाद अगले ही मुद्दे को जारी करेंगे।

async IO के साथ ऐसा करना इतना आसान नहीं है। या तो प्रतीक्षा का उपयोग करने के लिए स्विच करें (जो इसे एक आसान समस्या में बदल देता है) या सिंक्रोनस आईओ का उपयोग करें।

+0

में मदद करता है तो मेरा मुद्दा यह है कि मैं लंबित async में अपनी कतार को ऑफ़लोड कर रहा हूं? – Zapnologica

+2

हां। ______________________________ – usr

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