.net - 这种情况下需要STA消息循环吗?

标签 .net multithreading com sta

我正在 .NET 应用程序的线程上创建和运行一些 COM 对象。这些线程被标记为单线程公寓,一切似乎都正常。我的理解是,如果这些线程尝试从主线程访问 COM 对象,那么这些对象将在 .NET 中自动为我编码和序列化,因此即使在这种情况下,事情也会为我处理,所有安全和整洁,尽管也许有点慢。

我的问题是,虽然一切似乎工作正常,但我没有在我创建的 STA 线程中泵送消息循环。如果可以的话,我宁愿避免消息循环,因为它会导致额外的复杂性(以及可能的效率损失)。

我读过很多关于为什么消息循环是必要的建议(大部分来自非常有帮助的 Hans Passant),我的理解是消息循环在线程 A 上提供了一个位置,其他线程 B 可以在该位置请求可以对线程 A 上的 COM 对象进行整理和使用。如果这是正确的,那么只要没有其他线程向线程 A 上的 COM 对象请求任何内容,线程 A 不泵送消息循环是否安全?或者是否还有其他情况下消息循环也可能发挥作用?

我这是在玩火吗?是否有过这样的情况:你问自己是不是在玩火,而你却没有?

最佳答案

STA 合约需要泵送消息循环。但是,是的,不吸奶也是有可能的。有两个主要问题可能会出错:

  • 从另一个单元(包括另一个 STA 线程或 MTA 中的线程)对接口(interface)方法进行的任何调用都将无法完成。这看起来像是程序中的死锁,调用根本不会返回。请注意,您可以很好地控制自己的调用,但您不知道 COM 组件在做什么。它很可能会自己启动一个线程。您可以使用“调试”+“Windows”+“线程”在调试器中看到这一点。确保您在非托管模式下运行调试器,并且可以解释您看到的所有线程。顺便说一句,这并不是特别容易。

  • 许多单元线程 COM 组件都依靠消息循环来满足自己的需求。它可能是无害的计时器,当没有循环时它不会滴答。或者它可以在内部进行编码。使用 Spy++ 并检查您的新 STA 线程是否拥有任何隐藏窗口,如果您看到一个,则肯定是有问题的迹象。诊断结果是该组件行为不正常。不引发事件是一种常见的不幸。

当您对服务器的内部结构了解不够时,没有什么是真正难以解决的。请务必对其进行测试。

关于.net - 这种情况下需要STA消息循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654098/

相关文章:

c# - splitcontainer控件的splitter区域处理事件

multithreading - 餐饮哲学家的问题-需要澄清

multithreading - 多线程读少写的高性能排序数据结构设计

java - 错误: System Resource Exceeded

windows - TYPE_E_BUFFERTOOSMALL 和 DISP_E_BUFFERTOOSMALL HRESULT 值之间有什么区别?

c# - 为什么这段代码的执行速度比预期的要快?

c# - 从 List<T> 更新事务中的数据库

c# - 代码优先迁移是否自动在服务器上运行?

python - 使用 TLB 定义的接口(interface)与 Python 和 COM

Java 7 : COM-API does not work with Quality Center (OTAClient. dll),但适用于 Java 6