jony413

多媒体信息发布、排队叫号、医院分诊、电子班牌

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近同事一个项目在子线程下调用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);

posted on 2016-10-21 16:19  jony413  阅读(301)  评论(0)    收藏  举报