1

我在 C#.NET 中有一个简单的标签,似乎没有“更新”。它仅显示我的应用程序的第一个初始值。在下面的代码中,“score”变量不会更新,但是在调用 messagebox.show 对话框时它会显示正确的值。分数值在不同的线程中更改,但我不认为这是调用和跨线程表单控制的问题(因为我在创建 label6 的线程中调用此代码)。

有谁知道可能是什么解决方案?我尝试了 Application.DoEvents() 方法但无济于事。此外, label6.Update() 和 label6.Refresh() 在 label6.Text = score 线之后似乎都不起作用。

Player 是我创建的一个类,将分数值保存为公共 int。

    public Form1()
    {
        InitializeComponent();
        createGame();
    }
    public void createGame()
    {
        InitializeComponent();
        drawThread = new Thread(draw);  
        MessageBox.Show(player.score);
        label6.Text = player.score;
    }
    public void draw()
    {
        //do drawing, change player.score value
        //end thread
    }
    public void button_click()
    {
        if(firstrun)
            drawThread.Start()
        else{
            createGame()
            drawThread.Start()
        }

    }

编辑(来自评论):这是一个 WinForms 应用程序。label6.Text = score 行是调用 label6 的唯一实例,而不是在 Visual Studio 生成的 Form.Designer 代码中实例化。

4

2 回答 2

2

只是Refresh()在标签上做。

label6.Refresh();
于 2012-04-16T18:54:48.997 回答
1

在你的代码中我看到

drawThread = new Thread(draw);

但是在按钮上单击你调用draw.Start()所以我认为你的渲染线程根本没有启动!你不应该用drawThread.Start()吗?
更多:您不能从与主线程不同的线程访问图形控件属性,您应该使用Invoke...

我在这里看到一个问题:

  1. drawThread = new Thread(draw);
    MessageBox.Show(player.score);

    使用这些行启动第二个线程并立即显示 MessageBox(第二个线程可能尚未终止)

  2. label6.Text = player.score;
    当您关闭 MessageBox 时,将执行此行:如果第二个线程终止并且已经更新了分数,您将获得预期的结果;如果第二个线程仍在执行,则在您的标签中您仍然可以找到以前的分数。

因此,在不知道您的第二个线程做什么的情况下,我无法知道您的代码是否正确。
在我看来,您应该在第二个线程终止时label6.Text(使用)进行更新;Invoke如果没有,你为什么要使用第二个线程?
通常我们使用线程来执行长时间执行而不阻塞主线程(负责更新表单和处理用户输入),因此您应该在需要时从这些线程更新属性。
考虑使用BackgroundWorker

于 2012-04-16T20:59:36.753 回答