如何使用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,但真的无法理解它们。

如何使用c#中的线程按间隔更新标签

通过在当前位置调用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();