替代Thread.Sleep()暂时挂起程序

Dut*_*ner 1 c# sleep wait

请参阅本文底部的代码.它应该在列表框中添加"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();
        }
Run Code Online (Sandbox Code Playgroud)

Oli*_*ver 8

异步/等待救援:

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();
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ler 5

第一:为什么没有发生任何事情?

原因是,您目前处于UI线程中.通过Thread.Sleep挂起您希望绘制刚刚添加的项目的相同线程.

第二:如何解决这个问题?

正如@CodeCaster所提到的,你可以用a Timer做这一切.您还可以将代码放入a中,ThreadAdd使用DispatcherSynchronizationContext类及其方法调用Send方法.

第三:对Sleep方法的一点小提示.

通常它应该做你期望的,但不能保证.调用Sleep意味着您的线程将被暂停大约您想要的时间.看到这个答案