c# – 为什么我们不能改变ThreadPool线程的公寓状态,为什么在使用ShowDialog时我们不需要消息泵呢?

前端之家收集整理的这篇文章主要介绍了c# – 为什么我们不能改变ThreadPool线程的公寓状态,为什么在使用ShowDialog时我们不需要消息泵呢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近,我遇到了这种情况,我想在另一个线程(而不是主/ UI线程)上显示一个表单.我使用了线程池线程.该表单托管了一个RCW(用于COM组件).实例化表单给了我一个例外,即线程必须是STA.我试图将公寓状态设置为STA.但是,这也没有用.我最终明确地创建了一个线程并且有效(我使用ShowDialog并且不需要创建一个meesage泵).

编辑:

>我知道线程池线程是
MTA.但是,为什么不能设置为STA?
只是好奇这个.
>刚刚出现的另一个问题
我的头:我们为什么不要求
消息泵当Showdialog()(到
使用显示表格

解决方法

通过致电CoInitializeEx()选择公寓.线程池中的线程已经进行了该调用,在该调用之后无法更改公寓.

一个线程池选择MTA是有意义的,它毕竟是作为一个工作线程,不应该被需要编组的方法调用阻塞.选择单线程公寓还需要抽取消息循环.你永远不会期望线程池线程做的事情.

消息循环是必要的,因为这是COM用于封送在另一个线程上进行的调用的工具.该调用必须在STA线程中“注入”,这只有在线程处于已知的静止状态时才有可能.如果不是,这样的电话会引起重大的重新入侵问题.即使线程正在循环,它有时也会这样做.

您不需要使用Application.Run()自行填充消息循环,因为ShowDialog()会启动自己的消息循环.这就是它如何获得模态.对话框关闭后,嵌套循环将立即退出.

猜你在找的C#相关文章