【问题标题】:Working with HwndSource from BackgroundWorker从 BackgroundWorker 使用 HwndSource
【发布时间】:2012-04-12 17:23:41
【问题描述】:

我真的很绝望。我有 WPF MVVM 应用程序,我通过 USB 发送和接收一些数据包。我为此使用了一个库,而这个库需要 HwndSource。一切正常,但现在我需要发送很多数据包,这需要一些时间,所以我决定使用 BackgroundWorker 并显示 ProgressBar,但我不知道如何在 BackgroundWorker 中使用 HwndSource,因为我收到了这个错误:

调用线程必须是 STA,因为很多 UI 组件都需要这个。

谁能帮我解决这个问题?
谢谢。

【问题讨论】:

    标签: c# wpf mvvm backgroundworker


    【解决方案1】:

    使用单独的线程时,它们需要位于 STA(单线程单元)中,而后台工作线程则不是这种情况。如in this answer 所述,您可能必须自己创建线程

    Thread t = new Thread(ThreadProc); 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
    

    ThreadProcdelegate 类型的 ThreadStart

    【讨论】:

    • 感谢您的快速回答。我已经找到了您发布链接的文章。我只是想知道 BackgroundWorker 是否有一些解决方案。
    【解决方案2】:

    您能否将您的 UI 线程中的 HwndSource 传递给您的 BackgroundWorker?如果是这样并且不会导致任何性能问题,那将是最简单的。如果这会导致性能问题,最好的办法可能是创建自己的 STA 线程并在那里完成工作,而不是使用 BackgroundWorker

    【讨论】:

    • 也感谢您的快速回答。我使用@Killercam 的建议。我搜索了两天的任何解决方案,似乎让我自己的线程是管理这个问题的最佳方法。
    【解决方案3】:

    听起来它正在工作,除非您尝试更新进度控件。在 BW 的 ProgressChanged 事件中,如果您尝试直接更新控件,则可能会遇到您遇到的错误。由于您使用的是 MVVM,因此您应该在 ProgreeChanged 事件中更新绑定到进度控制的视图模型属性(如果您还没有这样做的话)。

    【讨论】:

    • 感谢您的回答。问题在于 HwndSource。当我调用它时,它会抛出已发布的错误。我读过一些关于它的东西here。我只想知道,是否有比创建自己的线程更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2011-12-13
    • 2018-06-25
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多