最近,我遇到了这种情况,我想在另一个线程(而不是主/ UI线程)上显示一个表单.我使用了线程池线程.该表单托管了一个RCW(用于COM组件).实例化表单给了我一个例外,即线程必须是STA.我试图将公寓状态设置为STA.但是,这也没有用.我最终明确地创建了一个线程并且有效(我使用ShowDialog并且不需要创建一个meesage泵).
编辑:
>我知道线程池线程是
MTA.但是,为什么不能设置为STA?
只是好奇这个.
>刚刚出现的另一个问题
我的头:我们为什么不要求
消息泵当Showdialog()(到
使用显示表格
解决方法
通过致电CoInitializeEx()选择公寓.线程池中的线程已经进行了该调用,在该调用之后无法更改公寓.
一个线程池选择MTA是有意义的,它毕竟是作为一个工作线程,不应该被需要编组的方法调用阻塞.选择单线程公寓还需要抽取消息循环.你永远不会期望线程池线程做的事情.
消息循环是必要的,因为这是COM用于封送在另一个线程上进行的调用的工具.该调用必须在STA线程中“注入”,这只有在线程处于已知的静止状态时才有可能.如果不是,这样的电话会引起重大的重新入侵问题.即使线程正在循环,它有时也会这样做.
您不需要使用Application.Run()自行填充消息循环,因为ShowDialog()会启动自己的消息循环.这就是它如何获得模态.对话框关闭后,嵌套循环将立即退出.