后台工作者启动COM组件

时间:2011-10-24 21:11:20

标签: c# com .net-4.0 backgroundworker

我正在使用一个非常慢的COM组件(花几分钟时间给我请求的数据)所以为了保持UI响应,在我的WPF应用程序中,我正在考虑使用Task或BackgroundWorker类来创建后台线程,并禁用UI上的所有控件以防止任何问题,因为该组件不是可线程的。

组件仅作为标准COM引用添加到项目中。问题是它从任何后台线程都不起作用(包括使用new进行初始化)。它从UI线程工作正常。任何指针都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

您是否尝试将[STAThread]属性添加到Main()

[STAThread]
static void Main()
{
}

当应用STAThreadAttribute时,它会将当前线程的单元状态更改为单线程 在没有深入讨论COM和线程的情况下,这个属性确保了当前线程与其他线程之间的通信机制,这些线程可能希望通过COM与它通信。 当您启动新的UI项目时,此属性通常会自动应用于Main。


或者(正如SLaks告诉我的那样)你可以尝试:

Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
....

public void ThreadProc()
{
    // Thread function
}

您可能还想使用

bool result = t.TrySetApartmentState(ApartmentState.STA);

并检查result值以确保您的尝试成功