最近同事一个项目在子线程下调用Com组件(语音播放组件),在主线程循环播放都没有问题,但子线程一直报错"System.Runtime.InteropServices.COMException (0x8000FFFF),没有注册接口 Error..."
后面用以下的设置就搞定了,child.SetApartmentState(System.Threading.ApartmentState.STA);//设置模式,必须在启动之前设置。。
最近项目需要使用多线程来访问一个外部的com组件。期间使用线程池,发现只有第一个线程在运行,别的都被阻塞了。查了无数资料,终于明白怎么回事了。
对于COM对象,线程池中的所有线程都是多线程单元(multithreaded apartment,MTA)线程。许多COM对象都需要单线程单元(single-threaded apartment,STA) 线程。
我用的com组件,理论上应该是单线程单元,没办法只能放弃线程池,使用Thread来创建线程。
用for循环,固定10个线程。
System.Threading.Thread child = new System.Threading.Thread(ThreadPoolCallback);
child.Name = "bbf_thread" + i.ToString();
child.IsBackground = true;
child.SetApartmentState(System.Threading.ApartmentState.STA);//设置模式,必须在启动之前设置。
child.Start(i);
浙公网安备 33010602011771号