标签文本不显示正确的值,但messagebox.show

时间:2012-04-16 18:47:47

标签: c# .net winforms string

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

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

播放器是我创建的一个类,它将得分值保存为公共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 line是唯一一个调用label6的实例,而不是在Visual Studio生成的Form.Designer代码中实例化。

2 个答案:

答案 0 :(得分:2)

只需在标签上Refresh()

label6.Refresh();

答案 1 :(得分:1)

在你的代码中我看到了

drawThread = new Thread(draw);

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

我在这里看到一个问题:

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

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

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

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