用Thread.Sleep()模拟加载

本文关键字:模拟 加载 Thread Sleep | 更新日期: 2023-09-27 18:14:46

(编辑-这是为了学习目的,只有程序是完全没有意义的)

我试图使它看起来像我的程序正在加载使用Thread.Sleep()随机生成的数字。它工作,它等待时间,但由于某种原因,它不会在屏幕上显示历史变量,直到所有的睡眠发生后。

它应该这样做

    打印登录…
  • 休眠5-10秒
  • 打印验证细节…
  • 休眠5-10秒
  • print已登录

我附加历史字符串的原因是因为我想在屏幕上保留所有以前的打印,我是编程新手,所以我认为这是最简单的方法。

        private void Loading()
    {
        Random rnd = new Random();
        int wait1 = rnd.Next(5000, 10000 );
        history = "Logging in...'n";
        historyLbl.Text = history;
        System.Threading.Thread.Sleep(wait1);
        int wait2 = rnd.Next(5000, 10000);
        history = history + "Verifying Details...'n";
        historyLbl.Text = history;
        System.Threading.Thread.Sleep(wait2);
        history = history + "Logged in.'n";
        historyLbl.Text = history;

    }

用Thread.Sleep()模拟加载

当您使用Thread.Sleep()时,它会阻塞线程。就像红灯一样,在石块被举起之前,什么也动不了。在简单的Windows窗体应用程序中,UI线程也运行所有的代码。所以当你在方法中阻塞线程时,你也阻塞了UI。

一个很好的技巧是使用asyncawait操作符,以及Task.Delay()

// Note the change in signature
private async Task Loading()
{
    Random rnd = new Random();
    int wait1 = rnd.Next(5000, 10000 );
    history = "Logging in...'n";
    historyLbl.Text = history;
    await Task.Delay(wait1);
    int wait2 = rnd.Next(5000, 10000);
    history = history + "Verifying Details...'n";
    historyLbl.Text = history;
    await Task.Delay(wait2);
    history = history + "Logged in.'n";
    historyLbl.Text = history;
}

这使用了一个特殊的语言特性,本质上是在上等待一个完整的单独线程,并在它完成时返回到您的代码中。这就是为什么UI不会冻结

好吧,我错了。Async和await总是有点神秘,我想我只是假设。

注意,无论在哪里调用这个方法,都需要等待它。例如,如果在单击按钮时执行此操作,则需要更改按钮单击事件处理程序

// async void is a special pattern for event handlers, to allow them to use async. 
// in general you should always use async Task
private async void Button_Click(object sender, EventArgs e)
{
    await Loading();
}

但更大的问题是你为什么要这样做?用户不希望等待的时间超过必须等待的时间。每隔一段时间,我使用Task.Delay()来允许我的UI线程赶上,但这最多只有20毫秒。