TimerCallback委托驱动STA模型.NET库组件

时间:2010-07-29 09:11:56

标签: .net multithreading apartments

我正在尝试使用TimerCallback委托机制在定时执行的单独线程上从第三方.NET库组件驱动对象实例。

当我尝试从库中创建对象的实例时,会引发异常:

  

(对象名称)只能从中调用   单线程公寓(STA)

作为我的应用程序入口点的子主程序标记为MTAThread,如msdn here上的Microsoft示例所示

1 个答案:

答案 0 :(得分:2)

单线程COM组件有一个很难要求您在STA线程上创建它们。通过使用消息循环在Main()方法上使用[STAThread]属性创建的。例如Application.Run()创建的那个。

现在可以从工作线程或计时器回调中调用此类组件。 COM确保满足组件的单线程需求,并封送调用STA线程。击败你想要完成的任务,对组件的所有调用只在一个线程上运行。你会让它变慢,而不是更快。对来电进行编组是快。

这里没有秘诀,你不能神奇地转变一个明确声明它不支持线程化为线程组件的组件。也不常见,绝大多数COM组件或.NET组件都不支持线程。 COM和.NET组件之间的区别在于COM对此做了些什么。 .NET组件通常只会在没有诊断的某种线程竞争中出现故障。