当前位置:  开发笔记 > 开发工具 > 正文

对象不是垃圾收集

如何解决《对象不是垃圾收集》经验,为你挑选了1个好方法。

我有一个我正在使用的第三方组件,我看到一些资源未被发布的问题.该组件导致Windows创建UDP套接字的句柄("\ Device\Udp"以及"\ Device\Afd").如果我允许程序执行和取消引用第三方对象,我认为就像我过去使用的所有.NET对象一样,该对象将被垃圾收集.但是,Process Explorer显示"\ Device\Udp"句柄被无限期保留,直到实际进程被终止(或者在有问题的应用程序中:应用程序池被回收.

此外,如果我手动调用对象的Dispose()方法,则释放句柄.这是我已经解决的问题,但我只是想知道为什么需要它.是否有可能组件的构建者已经做了某些事情或者设置了一些属性来阻止垃圾收集器调用对象的破坏?

如果有帮助,我已经发布了以下代码.代码在Forms应用程序中使用,因此在while循环完成后进程不会结束.

无法使用的代码(无限期创建100个句柄):

        for (int i = 0; i < n; i++)
        {
            Snmpmgr mgr = new Snmpmgr();
            mgr.Timeout = 10;

            mgr.ObjCount = 1;
            mgr.ObjId[1] = ".1.3.6.1.2.1.1.1.0";

            try
            {
                mgr.SendGetRequest();  // Handle shows up in ProcExplorer after this call
            }
            catch (Exception ex)
            {
                throw new TimeoutException("Error contacting CMTS.");
            }
        }  // end of for...  obj referenced by mgr never garbage collected

有效的代码(创建和释放的句柄):

        for (int i = 0; i < n; i++)
        {
            Snmpmgr mgr = new Snmpmgr();
            mgr.Timeout = 10;

            mgr.ObjCount = 1;
            mgr.ObjId[1] = ".1.3.6.1.2.1.1.1.0";

            try
            {
                mgr.SendGetRequest();  // Handle shows up in ProcExplorer after this 
            }
            catch (Exception ex)
            {
                throw new TimeoutException("Error contacting CMTS.");
            }
            mgr.Dispose();  // UDP Socket Handle freed...  not sure that's how to spell free + ed :)
        }

在此先感谢您的帮助.

克里斯



1> MiffTheFox..:

您在第二个示例中使用了mgr.Dispose调用.我会接受它mgr是一个IDisposable?

在这种情况下,您需要使用using块:

for (int i = 0; i < n; i++)
{
    using(Snmpmgr mgr = new Snmpmgr())
    {
        // Your Code
    }
}


如果您不想在每次使用后丢弃对象,那么您需要确保它在某些时候被丢弃.如果有一个可靠的点,你可以做到这一点,那将是有效的.但是,一般情况下,建议在有意义的情况下尽快处理.因此,请确保您没有比您应该更长时间地抓住物体.仔细想想这个.
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有