我有一些COM对象,我正在.NET应用程序的线程上创建和运行。线程被标记为Single Threaded Apartments,并且一切似乎都在起作用。我的理解是,如果这些线程试图从主线程访问COM对象,那么这些对象将在.NET中自动被封送和序列化,所以即使在这种情况下,我也会处理这些事情,所有的事情都是安全和整洁的,尽管也许有点慢。在这种情况下是否需要STA消息循环?
我的问题是,虽然事情似乎工作正常,我是而不是在我创建的STA线程中抽取消息循环。如果可以的话,我宁愿避免消息循环,因为它会导致额外的复杂性(以及可能的效率损失)。
我读过一堆关于为什么消息循环是必要的建议(主要来自非常有帮助的Hans Passant),我的理解是消息循环在线程A上给出了一个位置,其中一些其他线程B可以请求居住在线程A上的COM对象可以被封送和播放。如果这是正确的,那么只要没有其他线程从线程A上的COM对象请求任何东西,线程A是否安全不抽取消息循环?或者还有其他情况下消息循环可能会发挥作用吗?
我在这里玩火吗?有没有一种情况下,你问你是否在玩火,而你不是?
您有任何事件?你是否可以控制事件处理程序来确保它们的重新进入调用不会导致无限递归?如果您有消息泵,通常会使用发布消息来打破此循环。 –
我想我不知道与此相关的问题。什么会导致一个事件发生在我创建并且没有其他人正在看的线程中?我正在使用的COM对象?据我所知,他们不会引发任何事件... – user12861
如果您的COM对象的设计包括通知外部世界发生了什么,那么您可以实现传出事件接口,如IConnectionPointContainer。 –