加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

winforms – C#winform应用程序中的UserPreferenceChangedEventH

发布时间:2020-12-16 01:31:22 所属栏目:百科 来源:网络整理
导读:我发现一些我的winform应用程序控件,如DataGridView和ToolStrips,由UserPreferenceChangedEventHandlers引用.我不知道控件的哪个设置会生成这样的引用,以及为什么这样的引用会使我的控件在内存中保持活动状态.如何从该事件中删除此类引用?谢谢. 解决方法 它
我发现一些我的winform应用程序控件,如DataGridView和ToolStrips,由UserPreferenceChangedEventHandlers引用.我不知道控件的哪个设置会生成这样的引用,以及为什么这样的引用会使我的控件在内存中保持活动状态.如何从该事件中删除此类引用?谢谢.

解决方法

它是SystemEvents.UserPreferenceChanged事件的委托类型. 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线程上引发事件,但当多个线程创建它们时当然无法正确执行此操作.

还有那种可以产生持久影响的bug,例如一个启动画面,可以让SystemEvents类猜错哪个线程是你的UI线程.之后,它会在错误的线程上永久引发事件.非常难看to diagnose,僵局很好隐藏.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读