Windows窗体 - 多个事件循环

fuz*_*man 7 .net winforms

我有一个Windows窗体(.NET)应用程序,可以同时打开多个文档.

让每个文档(表单)运行自己的事件循环会很方便.通过简短的实验,在自己的STA线程中启动多个事件循环似乎可行.有什么理由说这是个坏主意吗?

Gar*_*ian 4

我认为在不同线程上创建多个消息循环是完全可以的。唯一需要注意的是,在处理第 3 方 UI 工具包时,它们有时将句柄存储为静态(而不是 ThreadStatic)成员,如果您的应用程序中有多个 UI 线程,则会出现问题(在我的情况下,我发现菜单/工具栏键盘加速器无法正常工作)。

这样做的一个重要原因是您是否有模式对话框显示在不同的非模式对话框上。如果将所有内容放在同一个消息循环中,那么如果其中一个非模式对话框具有模式对话框,则整个应用程序(所有窗口)都会被阻止,直到您关闭模式对话框。

并且,就像 Kevin 所说的那样,请注意跨窗口(跨线程)调用。您可以使用 Control.BeginInvoke 或 Control.Invoke 在其他 UI 线程上发布委托调用。

另一件需要考虑的事情是您将如何退出流程。您很可能需要跟踪消息循环,以便在您想要关闭所有内容时可以停止它们。如果您不在乎并且只想在所有窗口关闭时结束该过程,您也可以这样做。