भेजें, मैंने आज देखा कि मेरा एक एप्लीकेशन जो विकास कर रहा है वह स्मृति में गंभीरता से बढ़ रहा है। तो मैं एक दृश्य स्टूडियो मेमोरी प्रोफ़ाइल किया था और मैं निम्नलिखित परिणाम नहीं मिला:एसिंक सॉकेट के साथ मेमोरी इश्यू और
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)
}
}
}
कॉलबैक पोस्ट करें और जिस तरह से आप कतार को हटाते हैं। – usr
@usr होन :) उम्मीद है कि – Zapnologica