4
 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 内存分析器,

在此处输入图像描述

清理对象的任何建议。

谢谢。

4

1 回答 1

5

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

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

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

于 2012-07-31T08:05:21.740 回答