我真的很绝望。我有WPF MVVM应用程序,我通过USB发送和接收一些数据包。我使用了一个库,这个库需要HwndSource。一切正常,但现在我需要发送很多数据包,这需要一些时间,所以我决定使用BackgroundWorker并显示ProgressBar,但我不知道如何在BackgroundWorker中使用HwndSource,因为我收到了这个错误:
调用线程必须是STA,因为许多UI组件都需要这个。
任何人都可以帮我解决这个问题吗? 谢谢。
答案 0 :(得分:0)
您可以将您的UI线程中的HwndSource
传递给BackgroundWorker
吗?如果是这样并且它不会导致任何性能问题,那将是最简单的。如果这会导致性能问题,那么最好的办法就是创建自己的STA线程并在那里工作,而不是使用BackgroundWorker
。
答案 1 :(得分:0)
当使用单独的线程时,它们需要位于STA(单线程单元)中,而后台工作线程不是这种情况。您可能需要按照in this answer
所述自己创建线程Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
t.Start();
ThreadProc
是delegate
类型的ThreadStart
。
答案 2 :(得分:0)
除非您尝试更新进度控件,否则听起来很有效。在BW的ProgressChanged事件中,如果您尝试直接更新控件,则可能会遇到您遇到的错误。由于您正在使用MVVM,因此在ProgreeChanged事件中,如果您尚未执行此操作,则应更新绑定到进度控制的视图模型属性。