我有一个可以同时打开多个文档的Windows Forms (.NET)应用程序。
让每个文档(表单)运行自己的事件循环会很方便。通过简单的实验,在它们自己的STA线程中启动几个事件循环似乎是可行的。这是一个坏主意,有什么原因吗?
发布于 2008-10-30 14:56:58
我认为在不同的线程上创建多个消息循环是非常好的。唯一要注意的是,在处理第三方UI工具包时,它们有时会将句柄存储为静态(而不是ThreadStatic)成员,如果您的应用程序中有多个UI线程,则会出现问题(在我的例子中,我发现菜单/工具栏键盘加速器无法正常工作)。
这样做的一个重要原因是,如果您的模式对话框显示在不同的非模式对话框中。如果您将所有内容都放在相同的消息循环中,那么如果其中一个非模态对话框具有模态对话框,则整个应用程序(所有窗口)都会被阻塞,直到您关闭模态对话框。
而且,就像Kevin所说的,要当心跨窗口(跨线程)调用。您可以使用Control.BeginInvoke或Control.Invoke在其他UI线程上发布委托调用。
要考虑的另一件事是如何退出您的进程。您很可能需要跟踪消息循环,以便在您想要关闭所有内容时停止它们。如果你不关心,只想在所有窗口都关闭时结束进程,你也可以这样做。
发布于 2008-10-29 21:36:56
使用MDI (多文档界面)容器和子窗体可能更明智。在这种情况下,每个文档都有自己的形式,从技术上讲,这意味着每个文档都有自己的消息队列。
发布于 2008-10-29 21:20:20
从线程访问GUI元素时要小心。
https://stackoverflow.com/questions/248449
复制相似问题