gpt4 book ai didi

c# - 具有回调的委托(delegate)的内存泄漏

转载 作者:太空狗 更新时间:2023-10-30 01:07:37 24 4
gpt4 key购买 nike

 public delegate void SendCallbackType();

public class SenderBase
{
SenderBase()
{
mySend = new SendCallbackType(SendData);
mySend.BeginInvoke(SendCallback, null);
}

void SendData()
{
// process / sending data
}

void SendCallback(IAsyncResult ar)
{
**SendCallbackType worker = (SendCallbackType)((AsyncResult)ar).AsyncDelegate;
worker.EndInvoke(ar);**

//Above code is mandatory ? Working fine without them.

mySend.BeginInvoke(SendCallback, null);

}

// Test
Dictionary<SenderBase> SenderCollection = new Dictionary();
SenderCollection.Add(new SenderBase());
SenderCollection.Remove(0);
// Add and remove seven times

对象 (SenderBase) 未被垃圾收集。他们不断地传给下一代。

使用 RedAnts 内存分析器,

enter image description here

清理对象的任何建议。

谢谢。

最佳答案

您一直调用 mySend.BeginInvoke()。所以垃圾收集器总是在线程池线程的堆栈上看到对 mySend 对象的引用。因此不会收集它。当然,代码会一直运行下去。

在这种情况下不调用 EndInvoke() 是一个坏主意,每次调用 BeginInvoke() 都会泄漏 10 分钟的资源。默认的远程处理生命周期,远程处理是实现委托(delegate)的 BeginInvoke() 方法的底层管道。

很难提出清理代码的建议,这样做没有多大意义。您也可以使用 while(true) {} 循环启动一个线程。那肯定会更有效率。

关于c# - 具有回调的委托(delegate)的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716505/

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