如何使用c#中的线程按间隔更新标签
本文关键字:更新 标签 线程 何使用 | 更新日期: 2024-10-19 03:30:21
这是我的代码:
private void firstlabel()
{
doDisplayUpdate("klg");
}
private delegate void doDisplayUpdateDelegate(string result);
private void doDisplayUpdate(string text)
{
if (this.label2.InvokeRequired)
{
this.label2.Invoke(new doDisplayUpdateDelegate(doDisplayUpdate), text);
}
else
{
label2.Visible = true;
label2.Text = "Saving";
Thread.Sleep(500);
label2.Text = "Saving.";
Thread.Sleep(500);
label2.Text = "Saving..";
Thread.Sleep(500);
label2.Text = "Done";
}
}
firstlabel()由一个创建的线程调用,如下所示:
Thread ms = new Thread(new ThreadStart(firstlabel));
ms.Start();
我想做的基本上是更新标签3次(默认情况下标签不可见)。结果是,它运行了,但它将2的文本标记为"完成",并且不显示以前的字符串,如"保存"、"保存"或"正在保存.."。
调用firstLabel()方法时doDisplayUpdate中的参数仅用于测试目的。我试过查看后台工作线程和Task,但真的无法理解它们。
通过在当前位置调用Thread.Sleep()
,就锁定了UI线程。在您的方法运行完成之前,它无法更新Label
,因此您看不到任何更新。
相反,在另一个线程中调用Thread.Sleep()
,并且只有在您想要更新Label
时才回调到UI线程。
这会更好地工作:(但我建议阅读你提到的那些替代方法)
private void firstlabel()
{
doDisplayUpdate("klg");
Thread.Sleep(500);
doDisplayUpdate("Saving");
Thread.Sleep(500);
doDisplayUpdate("Saving.");
Thread.Sleep(500);
doDisplayUpdate("Saving..");
Thread.Sleep(500);
doDisplayUpdate("Done");
}
private delegate void doDisplayUpdateDelegate(string result);
private void doDisplayUpdate(string text)
{
if (label2.InvokeRequired)
{
label2.Invoke(new doDisplayUpdateDelegate(doDisplayUpdate), text);
}
else
{
label2.Text = text;
}
}
...
...
label2.Visible = true;
Thread ms = new Thread(new ThreadStart(firstlabel));
ms.Start();