用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()
时,它会阻塞线程。就像红灯一样,在石块被举起之前,什么也动不了。在简单的Windows窗体应用程序中,UI线程也运行所有的代码。所以当你在方法中阻塞线程时,你也阻塞了UI。
一个很好的技巧是使用async
和await
操作符,以及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毫秒。