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内存分析器,
任何清理物体的建议。
谢谢。
最佳答案
你一直在调用mysend.beginInvoke()。因此,垃圾收集器总是在线程池线程堆栈上看到对mysend对象的引用。所以不会收集。当然,代码一直在运行。
在这种情况下不调用endinvoke()是一个坏主意,它会为每个beginInvoke()调用泄漏10分钟的资源。默认的远程处理生存期remoting是实现委托的beginInvoke()方法的底层管道。
很难提出清理代码的建议,但这样做没有多大意义。不妨用while(true){}循环启动一个线程。那肯定会更有效率。