最近项目中用了COM控件,同时也用了多线程,在等待线程退出的地方,使用了
AutoResetEvent[] tEevents; //... WaitHandle.WaitAll(tEevents);
程序运行到这里,就会报错:
不支持一个STA线程上针对多个句柄的WaitAll
当时事情很急,将其调整为
AutoResetEvent[] tEevents; //... foreach(var tEvent in tEevents) { tEvent.WaitOne(); }
就将这个问题绕了过去。
后来,在Stackoverflow上面,查了STA和MTA的区别。COM线程模型称为Apartment模型,分为STA和MTA两种。
STA(Single Thread Apartment):
STA是非线程安全的,常用于UI界面,其他线程要访问STA模式的COM组件,需要通过STA线程进行访问(其实就变成了单线程调用)
MTA(Multi Thread Apartment):
MTA是线程安全的,COM的程序员自己处理了并发的问题,其他线程可以直接访问COM组件