- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现我的一些winform应用程序控件,例如DataGridView和ToolStrips,是由UserPreferenceChangedEventHandlers引用的。我不知道控件的什么设置会生成此类引用,也不知道为什么此类引用使我的控件在内存中保持事件状态。如何从该事件中删除此类引用?谢谢。
最佳答案
它是 SystemEvents.UserPreferenceChanged 事件的委托(delegate)类型。当 Windows 广播 WM_SETTINGCHANGE 消息时,会触发此事件。当用户使用控制面板小程序并更改系统设置时通常会发生这种情况。
有几个控件为此事件注册了事件处理程序:DataGridView、DateTimePicker、MonthCalendar、ProgressBar、PropertyGrid、RichTextBox、ToolStrip、NumericUpDown。他们通常对字体或提示更改以及任何会影响布局的内容感兴趣。
SystemEvents.UserPreferenceChanged 是静态事件。注册一个处理程序并忘记取消注册它会导致内存泄漏,它会阻止控件被垃圾收集。列出的控件确保不会发生这种情况,它们在 OnHandleDestroyed() 或 Dispose() 方法中取消注册事件处理程序。
当这两种方法都不运行时,您就会遇到麻烦。当您从容器的 Controls 集合中删除控件并忘记对其进行 Dispose() 时,就会发生这种情况。虽然忘记调用 Dispose() 通常不是问题,但这是对控件的硬性要求。也很容易忘记,控件通常由表单自动处理。但这仅发生在 Controls 集合中的控件中。
在获得对话框结果后,还请务必在使用 ShowDialog() 方法显示的表单上调用 Dispose()。 using 语句是处理该问题的最佳方法。
<小时/>还有一个关于 UserPreferenceChanged 事件的重要细节,当您在工作线程上创建控件时,它通常会导致应用程序死锁。通常当工作站被锁定时(按 Win+L)。当您使用我列出的控件时,这不会有一个好的结果,SystemEvents 类尝试在 UI 线程上引发事件,但当多个线程创建它们时,当然无法正确执行此操作。
还有一种可能产生持久影响的错误,例如启动屏幕可以让 SystemEvents 类错误地猜测哪个线程是您的 UI 线程。之后,它会在错误的线程上永久引发该事件。很丑to diagnose ,死锁被很好地隐藏了。
关于winforms - C# winform 应用程序中的 UserPreferenceChangedEventHandler 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137071/
我发现我的一些winform应用程序控件,例如DataGridView和ToolStrips,是由UserPreferenceChangedEventHandlers引用的。我不知道控件的什么设置会生
我是一名优秀的程序员,十分优秀!