首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自.Net Framework4.8以来,Windows Forms ComboBox中的内存泄漏

自.Net Framework4.8以来,Windows Forms ComboBox中的内存泄漏
EN

Stack Overflow用户
提问于 2019-12-09 05:03:50
回答 3查看 353关注 0票数 2

几周前我们从.NET Framework4.6切换到了4.8。从那时起,我们就有了由.NET框架本身引起的内存泄漏。

.NET Framework4.8使用级别3的辅助功能。对于win forms组合框,这意味着System.Windows.Forms.ComboBox.AccessibilityObject属性包含一个内部子类System.Windows.Forms.ComboBox.ComboBoxUiaProvider的对象,该对象具有内部属性ItemAccesssibleObjects,该属性是一个字典,其中包含所有添加到此组合框中的项。

因此,即使您清除了组合框中的项,此内部字典仍具有对该项的引用。所以所有添加到组合框中的项目都会被累加...这是一个内存泄漏。

如果将项目改回.NET Framework4.6,则不存在内存泄漏,因为将使用System.Windows.Forms.ComboBox.AccessibilityObject的另一个子类。

我想我可以通过停用.NET Framework4.8的第3级辅助功能来“解决”这个问题,但在我看来,这是一个太糟糕的解决方案。

当然,我想我可以使用反射来解决这个问题(从内部字典中删除该项),但我也不喜欢这个选项,因为这是内部机制,将来可能会发生变化……

有没有人知道这个问题/已经有好的解决方案了吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2019-12-10 03:56:48

一种可能的解决方案是:

使用您自己的函数覆盖ComboBox类:假设OwnComboBox.

  • to覆盖CreateAccessibilityInstance()函数,并在被覆盖的类中保留由基函数创建的对ComboBoxUiaProvider (AccessibleObject)的引用(注意,它可以是ComboBoxUiaProvider).

  • to以外的其他内容)覆盖函数Dispose(bool disposing)并手动清除内部字典。

可以提供帮助的链接:ComboBox code

票数 0
EN

Stack Overflow用户

发布于 2019-12-10 04:02:29

一种解决方案可能是:

使用您自己的函数覆盖ComboBox类:假设OwnComboBox.

  • to覆盖Dispose(bool disposing)函数,并执行此调用:this.WndProc(NativeMethods.WM_NCDESTROY).

可以提供帮助的链接:ComboBox code

票数 0
EN

Stack Overflow用户

发布于 2020-11-19 23:59:33

我们有一个非常相似的问题。从.net 4.6升级到4.8后,UserObjects和GDIObjects出现泄漏。只有当我们通过自动化工具运行内存泄漏测试时,它才可见。

将此代码添加到app.config

代码语言:javascript
复制
<runtime>
    <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;Switch.UseLegacyAccessibilityFeatures.3=true"/>
</runtime>

解决了它,但后来我们意识到我们不能在调试模式下运行我们的应用程序,或者有一些奇怪的错误。

所以问题在Combobox中是100%的。我们尝试了Bioukh和Dispose的答案。但后来我检查了一下,没有必要重写ComboBox。我们面临的问题是在动态地从视图中删除ComboBoxes时没有处理它们而导致的。

我们的问题是我们重用了视图。我们从视图中删除ComboBoxes,然后添加新的,而不处理旧的。显然,GC不会自动处理它们,或者有什么东西抓住了它们(我努力尝试,但没有找到任何东西)。

解决方法是-在删除它们之前,我们复制列表,将它们从视图中删除,然后处理列表中的每一项。内存泄漏现在已经消失了。这是一个link to documentation about removing controls from a collection programmatically

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59239895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档