关于c#:BackgroundWorker,更新gui,静态方法

BackgroundWorker, update gui, static method

本问题已经有最佳答案,请猛点这里访问。

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

我有一个静态类,其中引用了一些GUI对象。在我的逻辑中,我想从这个静态类调用方法,使用一些参数,分析它并更新GUI。但是我有"调用线程不能访问这个对象,因为另一个线程拥有它。"异常。

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

1
2
3
4
    public static void SetCardHand(ref CardHand ch)
    {
        cardHand = ch;
    }

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

1
2
3
4
5
6
7
8
private static void SetCoveredCardsPlayer0(int cardsNumber)
    {

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

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

编辑

这不是靠窗上课。有点像演讲者。

编辑2

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


在更新UI之前,必须将控制权传递回主线程。背景工作者使这相当容易。

  • 创建BackgroundWorker时,设置WorkerReportsProgress = true

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

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

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

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