我正在使用一个非常慢的COM组件(花几分钟时间给我请求的数据)所以为了保持UI响应,在我的WPF应用程序中,我正在考虑使用Task或BackgroundWorker Classes来创建后台线程,并禁用UI上的所有控件都可以防止出现任何问题,因为组件不是可线程的 .
该组件仅作为标准COM引用添加到项目中 . 问题是它从任何后台线程都不起作用(包括使用new进行初始化) . 它从UI线程工作正常 . 任何指针将不胜感激 .
您是否尝试将 [STAThread] 属性添加到 Main() ?
[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 值以确保您的尝试成功
result
1 回答
您是否尝试将
[STAThread]
属性添加到Main()
?应用STAThreadAttribute时,它会将当前线程的单元状态更改为单线程 .
在没有深入讨论COM和线程的情况下,该属性确保了当前线程与可能希望通过COM与之通信的其他线程之间的通信机制 .
当您启动新的UI项目时,此属性通常会自动应用于Main .
或者(正如SLaks告诉我的那样)你可以尝试:
你也可以想用
并检查
result
值以确保您的尝试成功