BackgroundWorker,更新gui,静态方法

时间:2013-12-21 17:29:14

标签: c# multithreading backgroundworker

我有应用程序,我正在使用后台工作程序来启动一些序列。 它有时需要更新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"];
    }

如何让这种方法改变GUI?

修改

这不是一个窗口类。它就像演示者一样。

EDIT2

它是纸牌游戏。我是在后台工作者中开始的,我需要在每次交易后更新图像源(代表卡片)。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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