gpt4 book ai didi

c# - SendToAsync内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 11:50:54 25 4
gpt4 key购买 nike

我有一个简单的.net 3.5sp1 Windows应用程序(在C#中)充当UDP服务器。它在端口上监听,从端点接收数据,然后将其接收的内容重新传输到另一个端点(即,用于实时广播数据流的中继)。我遇到的问题是,在连接大约20分钟后,它开始恶化。我还注意到它每秒吞噬大约50-100K的内存,而GC之后再也没有释放过。我必须关闭该应用程序并重新启动它。不好。我将问题缩小为以下代码,该代码将代码重新传输到另一端:

var sendBuffer = new byte[readCount];
Array.Copy(readData, sendBuffer, readCount);
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.RemoteEndPoint = p.EP;
args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
SwitchWindow.LineSocket.SendToAsync(args);

有没有人对SendToAsync有内存泄漏方面的经验?

更新:

初始化套接字时,我实例化了一个状态对象(仅执行一次)。状态对象具有一个称为“缓冲区”的属性,该属性是一个字节数组。我从套接字接收异步数据,如下所示:
private void beginReceiveData(ref MessageState state)
{
var ipeSender = new IPEndPoint(IPAddress.Any, 0);
var epSender = (EndPoint)ipeSender;

state.workSocket = LineSocket;
state.EP = epSender;
state.workSocket.BeginReceiveFrom(state.buffer, 0, MessageState.BufferSize,
SocketFlags.None, ref epSender,
new AsyncCallback(ReceiveDataCB),
state);
}

然后,在我的回调(ReceiveDataCB)上,我检索异步对象,然后将字节缓冲区传递给另一个函数进行处理,该函数依次调用上面发布的代码以重新传输到另一端(state.buffer变为readData)。 。

更新#2:

按照我的直觉,我将发送代码更改为以下代码,摆脱了SocketAsyncEventArgs和SendToAsync:
var sendBuffer = new byte[readCount];
Array.Copy(readData, sendBuffer, readCount);
SwitchWindow.LineSocket.BeginSendTo(
sendBuffer, 0, sendBuffer.Length, SocketFlags.None,
p.EP, new AsyncCallback(echoCB), null);

而且,当然,我添加了一个“echoCB”回调函数,除了调用EndSendTo之外没有任何其他作用。内存泄漏现在消失了!我怀疑这与创建这么多SocketAsyncEventArgs对象有关,并且异步函数卡在了这些对象上,每个数据包一个(每秒33个数据包,可以很快加起来)。我再次查看了有关SocketAsyncEventArgs的MSDN文档,并注意到在服务器上提供的“示例”代码中,它们使用了SocketAsyncEventArgs对象池。我认为它的设计并不是按照我使用它的方式工作。我认为重点在于不必为每个调用实例化这些缓冲区等,因此可以重用它们并允许服务器获得更好的性能。

最佳答案

您可能没有调用SocketAsyncEventArgs.Dispose()

关于c# - SendToAsync内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3283762/

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