我注意到今天我正在开发的一个应用程序在内存中严重增长。 所以我做了一个Visual Studio内存配置文件,我发现了以下结果:
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
的内存使用量之上这对我来说似乎不对,我不确定为什么会这样?
这是我的发送功能:
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();
}
}
应用程序阻塞并发QUEUE并发送消息,当它成功出列消息时,它会遍历所有已注册的(客户端)并将此消息发送给它们。
我是否正确使用了begin-send?
我要做的一件事是,它是异步的,我的程序是否可以遍历整个队列并将其全部卸载到异步系统缓冲区中?
{编辑}
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)
}
}
}
答案 0 :(得分:1)
对于每个队列项,您发出异步发送。这意味着无限数量的发送操作可能正在等待处理。资源使用是无限的。通常,您发出一个发送,并且只在上一个发送完成后发出下一个发送。
使用异步IO,这并不容易。切换到使用await(将其变回一个简单的问题)或只使用同步IO。