gpt4 book ai didi

winforms - C# winform 应用程序中的 UserPreferenceChangedEventHandler 是什么?

转载 作者:行者123 更新时间:2023-12-02 19:58:17 28 4
gpt4 key购买 nike

我发现我的一些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/

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