【发布时间】:2013-06-19 12:36:18
【问题描述】:
我认为我的问题类似于:
.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 网站的冷冻应用程序。 (我对其进行了修改以保持循环发送更改通知)。
我应该如何处理创建和运行新表单?即使尚未创建其句柄,在后台线程上创建表单是否重要?
【问题讨论】:
-
当然很重要。句柄在不到一毫秒后创建。在错误的线程上。所以不要那样做。
-
假设我想同时启动三个表单,每个表单都在各自的线程中。这样做的正确方法是什么?”
-
我也对术语“UI 线程”感到困惑。从 main() 我们创建了一个 windowManager 对象。这源自表单,但不显示 UI。然后我们调用 Application.Run(windowManager)。 WindowManager 有一个方法来启动一个新的子窗口。此方法创建一个后台线程 (background = true),然后创建一个新的子窗体,并调用 Application.Run(newChildForm)。因此,如果我从窗口管理器启动两个子窗口,这三个线程都是“UI 线程”吗? (main/windowManager 线程,以及为启动子窗口而创建的两个线程)
-
@Derek 正确的方法是不这样做。不要创建 3 个不同的 UI 线程;对所有三种表单使用一个 UI 线程。这才是“正确的方式”。