gpt4 book ai didi

c# - onuserpreferencechanged 挂起 - 处理多种表单和多种 ui 线程

转载 作者:行者123 更新时间:2023-12-02 12:00:04 24 4
gpt4 key购买 nike

我认为我的问题类似于:

.NET 4.0 and the dreaded OnUserPreferenceChanged Hang

我也浏览过:

http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance

我已经删除了我们的启动屏幕。

我还尝试添加建议的代码:Microsoft.Win32.SystemEvents.UserPreferenceChanged += delegate { };到我们的 main() 方法。

我正在寻找一些有关如何排除故障的想法和信息。

对于我们的 main() 方法,我们启动一个 windowmanager 类,它是一个使用 Application.Run 的表单它只是任务托盘中的一个图标(我们不显示窗口)。

每当我们启动一个对象时,我们都会有一个后台线程来创建一个表单,然后执行 Application.Run( form )

在Application.Run( form ) form.IsHandleCreated = false 时。

我使用 MysteriousHang 网站上的冷冻机应用程序。 (我修改了它以继续循环发送更改通知)。

我应该如何处理创建和运行新表单?即使尚未创建其句柄,在后台线程上创建表单是否重要?

最佳答案

I'm also confused about the terminology "UI thread".

UI 线程是泵送消息循环的线程。并且以与用户界面对象兼容的模式运行,它需要是一个STA,一个单线程单元。这是一个 COM 实现细节,对于非线程安全且需要 STA 的常见 UI 操作非常重要,例如拖放、剪贴板、OpenFileDialog 等 shell 对话框和 ActiveX 组件。

CLR 的工作是调用 CoInitializeEx() 并选择公寓类型。它通过程序中 Main() 入口点上的 [STAThread] 属性来执行此操作。存在于创建 UI 对象的项目中,例如 Winforms 或 WPF 应用程序。但不是控制台模式应用程序或服务。对于工作线程,换句话说,由您的代码而不是 Windows 创建的线程,单元类型由您传递给 Thread.SetApartmentState() 方法的内容选择。默认是MTA,风格错误。线程池线程始终是 MTA,无法更改。

SystemEvents 类承担着一项艰巨的任务,即确定程序中哪个线程是 UI 线程。重要的是它可以在正确的线程上引发事件。它通过使用启发式方法来实现此目的,订阅事件的第一个线程并且是 STA 线程被认为是合适的。

当猜测不准确时,事情就会出错。或者当然,在您尝试创建多个线程来创建 UI 对象的情况下,猜测只能对其中一个正确。您可能还忘记调用 Thread.SetApartmentState(),因此它对于其中任何一个都是不正确的。 WPF 更强烈地断言这一点,并且当线程不是 STA 时将生成异常。

UserPreferenceChanged 事件是一个麻烦制造者,它被您在工具箱上找到的一些控件订阅。他们用它来知道事件视觉样式主题已更改,因此他们将使用新的主题颜色重新绘制自己。其中一些控件的事件处理程序的一个重大缺陷是,它们假定事件是在正确的线程(即创建控件对象的同一线程)上引发的。

您的程序不会出现这种情况。结果往往是不愉快的,微妙的绘画问题是一个小缺陷,僵局当然是可能的。由于某种原因,使用Windows+L锁定工作站并解锁它特别容易导致死锁。在这种情况下,由于桌面从安全桌面切换到用户桌面,因此会引发 UserPreferenceChanged 事件。

监听 UserPreferenceChanged 事件并且不使用安全线程实践(使用 Control.BeginInvoke)的控件是 DataGridView、NumericUpDown、DomainUpDown、ToolStrip+MenuStrip 和 ToolStripItem 派生类,可能是 RichTextBox 和进度条(不清楚)。

消息应该很清楚,您正在使用不安全的线程实践,并且它们可以字节。一般来说,在工作线程上创建 UI 没有任何意义,Winforms 或 WPF 程序的主线程已经能够支持多个窗口。除了避免危险的控制之外,这就是您应该努力摆脱问题的方法。

关于c# - onuserpreferencechanged 挂起 - 处理多种表单和多种 ui 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17191389/

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