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){}循环启动一个线程。那肯定会更有效率。

10-08 06:37