首页 文章

后台工作者启动COM组件

提问于
浏览
0

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

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

1 回答

  • 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 值以确保您的尝试成功

相关问题