【问题标题】:BackgroundWorker, update gui, static method [duplicate]BackgroundWorker,更新 gui,静态方法 [重复]
【发布时间】:2014-01-10 09:06:42
【问题描述】:

我有一个应用程序,我正在使用后台工作程序来启动一些序列。 有时需要更新 GUI。

我有引用一些 gui 对象的静态类。 在我的逻辑中,我想用一些参数从这个静态类中调用方法,在那里分析它并更新 GUI。 但我有“调用线程无法访问此对象,因为另一个线程拥有它。”异常。

在第一个线程中设置变量:

    public static void SetCardHand(ref CardHand ch)
    {
        cardHand = ch;
    }

从后台工作线程调用的方法:

private static void SetCoveredCardsPlayer0(int cardsNumber)
    {

        if (cardsNumber < 1)
            cardHand.imgCard1.Source = null;
        else
            cardHand.imgCard1.Source = (ImageSource)WindowManager.Instance.CardsGUI.CardsDictionary["T1"];
    }

如何让这个方法改变图形界面?

编辑

它不是一个窗口类。有点像主持人。

编辑2

这是一款纸牌游戏。我在后台工作人员中启动它,我需要在每次交易后更新图像源(代表卡)。

【问题讨论】:

  • 根据您的应用设计,大纲为 backgroundworker.WorkerReportsProgress = true,并订阅将在 UI 线程上运行的 ProgressChanged。
  • 你必须详细说明在哪里调用 SetCoveredCardsPlayer0。它应该来自 Completed 或 ProgressChanged 事件处理程序——如果不是,您将获得该异常。如果您在 Completed 或 ProgressChanged 事件处理程序以外的其他东西上进行调用,请查看 Grant 在下面发布的答案

标签: c# multithreading backgroundworker


【解决方案1】:

在更新 UI 之前,您必须将控制权传递回主线程。 BackgroundWorker 使这变得相当容易。

  1. 创建BackgroundWorker 时,设置WorkerReportsProgress = true。

  2. 订阅 ProgressChanged 事件,并将更新 UI 的逻辑放入该事件中。

  3. 在您的 DoWork 事件中,当您想要更新 GUI 时,调用 myBackgroundWorker.ReportProgress(0, someObject),其中“someObject”是您想要操作的数据。在您的情况下,可能是您分配给cardHand.imgCard1.Source 的ImageSource。

  4. 在ReportProgress 事件中,您可以通过e.UserState 访问您传递的对象。在使用它之前,您需要将其转换回 ImageSource。

您可以将if (cardsNumber &lt; 1) 逻辑保留在DoWork 事件中,但是当您想将Source 设置为ImageSource(或null)时,您需要将该值传递给ProgressChanged 事件来实际更新 UI 元素。

【讨论】:

  • 这很好,但我需要几个不同类型的更新。怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多