我在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代码中实例化。
答案 0 :(得分:2)
只需在标签上Refresh()
。
label6.Refresh();
答案 1 :(得分:1)
在你的代码中我看到了
drawThread = new Thread(draw);
但是点击按钮会调用draw.Start()
,所以我认为你的渲染线程根本没有启动!你不应该使用drawThread.Start()
吗?
更多:您无法从与main不同的线程访问图形控件属性,您应该使用Invoke
...
我在这里看到一个问题:
drawThread = new Thread(draw);
MessageBox.Show(player.score);
使用这些行启动第二个线程并立即显示MessageBox(可能还没有终止第二个线程)
label6.Text = player.score;
当你关闭MessageBox时,这一行被执行:如果第二个线程被终止并且已经更新了分数,你将得到预期的结果;如果第二个线程仍在执行,则在您的标签中仍然可以找到之前的分数。
所以不知道你的第二个线程是做什么的,我不知道你的代码是否正确
在我看来,你应该在终止时从你的第二个线程(使用label6.Text
)更新Invoke
;如果没有,你为什么要使用第二个线程?
通常我们使用线程执行长时间执行而不阻塞主线程(它负责更新表单和处理用户输入),因此您应该在需要时更新这些线程的属性。
考虑使用BackgroundWorker。