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

用于驱动STA模型.NET库组件的TimerCallback委托,.net,multithreading,apartments,.net,Multithreading,Apartments,我正在尝试使用TimerCallback委托机制在单独的线程上驱动来自第三方.NET库组件的对象实例,这些线程是定时执行的 当我尝试从库I创建对象实例时,会引发异常: (对象名称)只能从中调用 单线程公寓(STA) 作为我的应用程序入口点的sub-main被标记为MTAThread,因为在msdn上的Microsoft示例中,单线程COM组件很难要求您在STA线程上创建它们。通过在Main()方法上使用[StatThread]属性并通过泵送消息循环来创建。例如由Application.Run()

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

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

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


作为我的应用程序入口点的sub-main被标记为MTAThread,因为在msdn上的Microsoft示例中,单线程COM组件很难要求您在STA线程上创建它们。通过在Main()方法上使用[StatThread]属性并通过泵送消息循环来创建。例如由Application.Run()创建的

现在可以从工作线程或计时器回调调用这样的组件。COM确保满足组件的单线程要求,并封送调用STA线程的数据。与您试图完成的任务背道而驰的是,对组件的所有调用只在一个线程上运行。你会让它变慢,而不是变快。封送呼叫并不快

这里没有秘密,您不能神奇地将一个明确声明不支持线程的组件转换为线程化组件。绝大多数COM组件或.NET组件都不支持线程,这一点也不少见。COM和.NET组件之间的区别在于COM对此做了一些事情。NET组件通常只会在没有诊断的情况下在某种线程竞赛中发生故障