gpt4 book ai didi

.net - 对象未被垃圾收集

转载 作者:行者123 更新时间:2023-12-01 15:05:46 26 4
gpt4 key购买 nike

我有一个正在使用的第三方组件,我发现一些资源未被释放的问题。该组件使 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 :)
}

预先感谢您的帮助。

克里斯

最佳答案

您在第二个示例中使用了 mgr.Dispose 调用。我会认为 mgr 是 IDisposable 吗?

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

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

关于.net - 对象未被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095729/

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