gpt4 book ai didi

c# - 异步套接字的内存问题并开始发送

转载 作者:太空狗 更新时间:2023-10-29 23:45:34 27 4
gpt4 key购买 nike

我今天注意到我正在开发的一个应用程序的内存正在严重增长。所以我做了一个 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)
}
}
}

最佳答案

对于每个队列项目,您发出一个异步发送。这意味着无限数量的发送操作可能处于挂起状态。资源使用是无限的。通常,您会发送一个发送,并且仅在前一个发送完成后才发送下一个。

对于异步 IO,这不是那么容易做到的。要么改用 await(这又会变成一个简单的问题),要么只使用同步 IO。

关于c# - 异步套接字的内存问题并开始发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24803568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com