加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么我们不能改变ThreadPool线程的公寓状态,为什么在使

发布时间:2020-12-15 18:34:18 所属栏目:百科 来源:网络整理
导读:最近,我遇到了这种情况,我想在另一个线程(而不是主/ UI线程)上显示一个表单.我使用了线程池线程.该表单托管了一个RCW(用于COM组件).实例化表单给了我一个例外,即线程必须是STA.我试图将公寓状态设置为STA.但是,这也没有用.我最终明确地创建了一个线程并且有
最近,我遇到了这种情况,我想在另一个线程(而不是主/ UI线程)上显示一个表单.我使用了线程池线程.该表单托管了一个RCW(用于COM组件).实例化表单给了我一个例外,即线程必须是STA.我试图将公寓状态设置为STA.但是,这也没有用.我最终明确地创建了一个线程并且有效(我使用ShowDialog并且不需要创建一个meesage泵).

编辑:

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

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读