是STA消息循环此时需要?(Is STA Message Loop Required in This

2019-06-24 13:34发布

我有一些COM对象我创建并在.NET应用程序的线程运行。 该线程被标记为单线程公寓,一切似乎是工作。 我的理解是,如果这些线程试图从主线程访问COM对象,然后这些对象会被自动编组和.NET系列化我,所以即使在这种情况下,事情会为我处理,所有的安全和整洁,但也许有点慢。

我的问题是,当事情似乎是工作的罚款,我抽在STA线程我创建一个消息循环。 我宁愿避免消息循环,如果我可以,因为额外的并发症,会引起(以及可能的效率损失为好)。

我读过关于为什么消息循环是必要的(大多来自很有帮助汉斯帕桑特)一堆意见,我的理解是,消息循环给出一个线程A一个地方,一些其他的线程B可以请求COM对象住在线程A可以编组与播放。 如果没有其他线程从线程A COM对象要求什么这是正确的,那么只要是在线程不抽消息循环的安全吗? 还是有其他情况的消息循环可能会发挥作用呢?

我是不是在玩火吗? 而且是有过,你问,如果你是在玩火的情况下和你不?

Answer 1:

该STA合同要求抽消息循环。 但是,是的,有可能逃脱不抽。 有两个主要的事情可能出错:

  • 这对接口方法做出从另一个公寓,其中包括另一个STA线程或MTA线程将无法完成任何呼叫。 这看起来像在你的程序死锁,调用根本不会返回。 要注意的是,你可以控制自己的电话相当不错,但你不知道什么是COM组件在做什么。 它很可能启动一个线程本身。 您可以在调试+的Windows +线程调试器看到这一点。 请确保您正在运行的非托管模式下的调试器和可以解释所有你看到的线程。 特别不容易BTW。

  • 许多单元线程COM组件指望有一个消息循环以自己的需要照顾。 这可能是一些无关痛痒的定时器,当没有循环也不会打勾。 或者,它可能会做内部编组。 用狙++,检查是否存在由新STA线程,麻烦肯定的标志,如果你看到一个拥有任何隐藏的窗口。 诊断仅仅是行为不端的组件。 不认识活动是一种常见的事故。

真的没什么钉在墙上,当你不知道有足够的了解服务器的内部结构。 一定要测试赫克出来。



Answer 2:

COM调用可以在没有消息循环编组。

当您的STA线程在大多数情况下在等待着什么,会自动处理任何挂起的COM调用。

对于文档的Thread.join说Blocks the calling thread [...] while continuing to perform standard COM and SendMessage pumping.

同样的情况,一个名为代表的许多其它功能(CoWaitForMultipleHandles等),例如,当你的线程在等待IO。



文章来源: Is STA Message Loop Required in This Case?