我正在使用一个非常慢的COM组件(花几分钟时间给我请求的数据)所以为了保持UI响应,在我的WPF应用程序中,我正在考虑使用Task或BackgroundWorker类来创建后台线程,并禁用UI上的所有控件以防止任何问题,因为该组件不是可线程的。
组件仅作为标准COM引用添加到项目中。问题是它从任何后台线程都不起作用(包括使用new进行初始化)。它从UI线程工作正常。任何指针都将受到赞赏。
答案 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
值以确保您的尝试成功