套接字上的 OverlappedData 内存泄漏

z3n*_*10n 6 c# sockets memory-leaks heap-profiling

我正在使用异步套接字使用 MSDN 文档在客户端和服务器之间建立连接:

https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.100).aspx

我开始使用同步,后来使用异步。成功完成第一个应用程序后,我开始在 GitHub 存储库中搜索更多代码和更多解释。我找到了这个:

https://github.com/perrybutler/csharpsockets

没关系,它可以工作,但是它有内存泄漏,我开始分析,我发现了这一点:

在此输入图像描述

(可能存在内存泄漏)

在此输入图像描述

在此输入图像描述

在此输入图像描述

(随处可见 Cycle Detected 语句。我不知道它们的意思。我想应用程序或 GC 强制它停止并将其标记为 Cycle)。

我认为有些问题,因为如果你发送 1MB 的数据,内存应该只增加 1MB,但后来会减少。但这并没有发生。我开始在不引发异常的情况下处理所有内容,但这并没有多大帮助。

我开始在 StackOverflow 和其他地方搜索这个,我发现了这个:

.NET 没有可靠的异步套接字通信?

但是,我不太明白那里正在讨论什么。

我还发现了这个:

https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

我读到套接字需要确认何时已经在 BeginSend/EndSend 和 BeginReceive/EndReceive 之间发送数据,因为如果没有,它将等待这一点,并开始增加内存(直到检测到周期?)

也许通过我分享的 CodeProject 我应该得到这个?我不知道,我必须从哪里开始。

我需要一个指南。我将尝试分析 CodeProject。

小智 0

我遇到了同样的问题,我的错误代码:

NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
Run Code Online (Sandbox Code Playgroud)

固定代码:

using (NetworkStream stream = client.GetStream())
{
    stream.Write(data, 0, data.Length);
} 
Run Code Online (Sandbox Code Playgroud)