0

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

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

(对象名)只能从单线程单元(STA)调用

作为我的应用程序入口点的 sub main 被标记为 MTAThread,如 msdn 上的 Microsoft 示例所示

4

1 回答 1

2

单线程 COM 组件具有在 STA 线程上创建它们的硬性要求。您可以通过使用 Main() 方法上的 [STAThread] 属性通过发送消息循环来创建它。比如Application.Run()创建的那个。

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

这里没有秘诀,你不能神奇地将明确声明它不支持线程的组件转换为线程组件。绝大多数 COM 组件或就此而言的 .NET 组件也不支持线程,这并不罕见。COM 和 .NET 组件之间的区别在于 COM 对此做了一些处理。.NET 组件通常会在没有诊断的情况下在某种线程竞争中发生故障。

于 2010-07-29T10:39:27.703 回答