![]() |
1
2
是的,您正在与SystemEvents类发生冲突。该类创建一个侦听系统事件的隐藏窗口。特别是UserPreferenceChanged事件,许多控件使用该事件来知道何时需要重新绘制自己,因为系统颜色已更改。 问题是,创建窗口的初始化代码对调用它的线程的单元状态非常敏感。在您的例子中,这是错误的,您没有调用Thread.SetApartmentState()来切换到STA。那是 非常 请注意,您的解决方案实际上并不是修复程序,系统事件将在错误的线程上引发。你的splash线程而不是你程序的UI线程。当一个实际的系统事件被触发时,您仍然会得到随机的和非常难以诊断的故障。最臭名昭著的是,当用户锁定工作站时,程序会在再次解锁时死锁。 我认为调用Thread.SetApartmentState()应该可以解决您的问题。不是100%确定,这些UI线程交互很难分析,我还没有搞错。请注意,.NET已经有很多 solid support 用于启动屏幕。这样的细节肯定是对的。 |
![]() |
2
1
我能够模拟你的问题,我可以提供一个解决办法,但可能有一个更好的选择,因为这是我第一次遇到这个。 避免异常的一个方法是不关闭启动屏幕,而只是隐藏它。像这样的
然后,让线程在后台线程上运行启动屏幕非常重要,以确保启动屏幕线程不会使应用程序保持活动状态。所以你的代码看起来像这样
|
![]() |
JOO · 使用udpClient从多个IP地址连续接收数据 3 年前 |
![]() |
Futterkiste · 函数比例图 3 年前 |
![]() |
user18789895 · 我应该如何验证WinForms应用程序? 3 年前 |
![]() |
beriscen · 如何使整个链接标签区域可点击? 3 年前 |
![]() |
lpmaxim · 当鼠标光标悬停在按钮上时,背景图像会移动 3 年前 |