虽然有很多关于COM和STA/MTA的问题(例如这里),但大多数都是谈论具有UI的应用程序。而我有以下设置:
- 一个控制台应用程序,默认情况下为多线程公寓(Main() 显式具有
[MTAThread]
特性)。 - 主线程生成一些工作线程。
- 主线程实例化单线程COM对象。
- 主线程调用 Console.ReadLine() 直到用户按下 'q',此后应用程序终止。
几个问题:
- 许多地方提到了 COM 对象需要消息泵的需求。我是否需要手动为主线程创建消息泵,或者CLR会像这里的问题建议的那样,为我在新的STA线程上创建它?
- 只是为了确保——假设CLR自动创建必要的管道,那么我是否可以在任何工作线程中使用COM对象而无需显式同步?
- 以下哪种方法在性能方面更好:
- 让CLR处理与COM对象之间的编组。
- 在单独的STA线程上明确实例化对象,并使其他线程通过例如
ConcurrentQueue
与之通信。