C# Thread.Sleep()临时挂起程序的替代方法

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

请参阅本文底部的代码。它应该在列表框中添加“3”,然后在一秒钟后添加“2”,再在一秒钟后添加“1”,然后运行程序的主代码。然而,一旦我执行了这个程序,它只会保持空白3秒钟,然后显示所有的3、2和1,之后所有的代码都会直接启动。我希望看到每一个数字都以一秒的延迟出现。我该怎么做

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线程置于睡眠状态是一个相当严重的错误,可能会带来严重的后果。没有看到更新只是一个小事故,还有更糟的。用户喜欢响应性强的程序,没有必要故意放慢速度。使用计时器制作动画。