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