C# Thread.Sleep()临时挂起程序的替代方法
请参阅本文底部的代码。它应该在列表框中添加“3”,然后在一秒钟后添加“2”,再在一秒钟后添加“1”,然后运行程序的主代码。然而,一旦我执行了这个程序,它只会保持空白3秒钟,然后显示所有的3、2和1,之后所有的代码都会直接启动。我希望看到每一个数字都以一秒的延迟出现。我该怎么做C# Thread.Sleep()临时挂起程序的替代方法,c#,wait,sleep,C#,Wait,Sleep,请参阅本文底部的代码。它应该在列表框中添加“3”,然后在一秒钟后添加“2”,再在一秒钟后添加“1”,然后运行程序的主代码。然而,一旦我执行了这个程序,它只会保持空白3秒钟,然后显示所有的3、2和1,之后所有的代码都会直接启动。我希望看到每一个数字都以一秒的延迟出现。我该怎么做 private void Main() { countdown(); //Main Code } private void countdow
private void Main()
{
countdown();
//Main Code
}
private void countdown()
{
listBox1.Items.Clear();
listBox1.Items.Add("3");
System.Threading.Thread.Sleep(1000);
listBox1.Items.Add("2");
System.Threading.Thread.Sleep(1000);
listBox1.Items.Add("1");
System.Threading.Thread.Sleep(1000);
listBox1.Items.Clear();
}
放置一个
listBox1.Refresh()每次调用Sleep()
您让线程休眠,但UI不会自动重新绘制。放置一个listBox1.Refresh()每次调用Sleep()
您让线程休眠,但UI不会自动重新绘制。首先:为什么什么都没有发生
原因是,您当前在UI线程中。通过执行Thread.Sleep
可以挂起与您希望绘制刚才添加的项目相同的线程
第二:如何解决这个问题
正如@CodeCaster所提到的,您可以使用计时器来完成这一切。您还可以将代码放入线程
中,并通过使用调度程序
或同步上下文
类及其发送
方法调用添加
方法
Third:关于Sleep
方法的一个小提示
通常它应该做你期望它做的事情,但这并不能保证。调用Sleep
意味着您的线程将被暂停大约您想要的时间 首先:为什么什么都没有发生
原因是,您当前在UI线程中。通过执行Thread.Sleep
可以挂起与您希望绘制刚才添加的项目相同的线程
第二:如何解决这个问题
正如@CodeCaster所提到的,您可以使用计时器来完成这一切。您还可以将代码放入线程
中,并通过使用调度程序
或同步上下文
类及其发送
方法调用添加
方法
Third:关于Sleep
方法的一个小提示
通常它应该做你期望它做的事情,但这并不能保证。调用Sleep
意味着您的线程将被暂停大约您想要的时间 您可以使用计时器
将间隔设置为1000
。当您希望计时器触发勾选事件时,启动计时器。停止以停止引发勾选事件。处理勾选事件
并每隔一段时间运行代码
但是,按照另一个答案中的建议,使用async Wait创建倒计时3-2-1函数是个好主意:
private async void countdown()
{
listBox1.Items.Clear();
listBox1.Items.Add("3");
await Task.Delay(1000);
listBox1.Items.Add("2");
await Task.Delay(1000);
listBox1.Items.Add("1");
await Task.Delay(1000);
listBox1.Items.Clear();
}
您可以使用计时器
,将间隔设置为1000
。当您希望计时器触发勾选事件时,启动计时器。停止以停止引发勾选事件。处理勾选事件
并每隔一段时间运行代码
但是,按照另一个答案中的建议,使用async Wait创建倒计时3-2-1函数是个好主意:
private async void countdown()
{
listBox1.Items.Clear();
listBox1.Items.Add("3");
await Task.Delay(1000);
listBox1.Items.Add("2");
await Task.Delay(1000);
listBox1.Items.Add("1");
await Task.Delay(1000);
listBox1.Items.Clear();
}
异步/等待救援:
private async void OnButtonClick(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("3");
await Task.Delay(1000);
listBox1.Items.Add("2");
await Task.Delay(1000);
listBox1.Items.Add("1");
await Task.Delay(1000);
listBox1.Items.Clear();
}
异步/等待救援:
private async void OnButtonClick(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.Add("3");
await Task.Delay(1000);
listBox1.Items.Add("2");
await Task.Delay(1000);
listBox1.Items.Add("1");
await Task.Delay(1000);
listBox1.Items.Clear();
}
尝试搜索,Thread.Sleep()阻塞UI线程,使用计时器。将GUI程序的UI线程置于睡眠状态是一个相当严重的错误,可能会带来严重的后果。没有看到更新只是一个小事故,还有更糟的。用户喜欢响应性强的程序,没有必要故意放慢速度。使用计时器进行动画。尝试搜索,Thread.Sleep()会阻止UI线程,请使用计时器。将GUI程序的UI线程置于睡眠状态是一个相当严重的错误,可能会带来严重的后果。没有看到更新只是一个小事故,还有更糟的。用户喜欢响应性强的程序,没有必要故意放慢速度。使用计时器制作动画。