代码之家  ›  专栏  ›  技术社区  ›  barlop Sandeep

在C WinForms应用程序中,为什么这个“休眠一段时间”循环不起作用?

  •  0
  • barlop Sandeep  · 技术社区  · 7 年前

    这不是的副本 Thread.sleep() in while loop doesn't work properly? 因为那个答案是他把毫秒和秒混在一起。

    我有一张带按钮和标签的表格

    点击按钮时我有这个代码

    单击按钮调用执行此操作的函数

                int a, b;           
                int i=0;
                while(i<5)
                {
                    i += 1;
                    Thread.Sleep(1000);
                    label1.Text += "a";               
                }
                MessageBox.Show("done");
    

    我会‘期望’/want,它应该写下每一个5’a’,在每一个a之间停顿一秒钟。

    但它没有,它缓冲了它们。它等待5秒钟,然后一次性写入所有“A”,并打印“完成”。

    为什么是缓冲?

    我不想使用计时器,因为我希望它是连续的。在定时任务完成之前,我不想“完成”打印。

    怎样才能得到我想要的代码?

    这个问题有一个公认的答案 C# - How to pause application until timer is finished? 我不太明白,我会测试它,但我甚至看不到如何测试它,因为我真的看不到我把接受的答案中的代码放在哪里,我如何调整它 https://i.imgur.com/gjRDEiX.png 似乎被接受的答案有子类计时器或其他东西,这似乎对我的问题/问题不必要。

    注意-有人建议 Keep UI thread responsive when running long task in windows forms 会解决我的问题。这个问题的例子非常复杂,因为TI有很多不相关的东西,答案也符合这个要求,包括了所有的复杂性。很难理解这个问题和答案。我的问题要简单得多,因此答案要简单得多。这里接受的答案没有 token.ThrowIfCancellationRequested(); 很难将这个复杂的答案与我的简单问题相适应。我当然不会接受这个问题的公认答案作为我的答案。汉斯实际上只回答了一句话。我认为一句话的回答不适用于那个问题。所以我的问题和那个不同。

    1 回复  |  直到 7 年前
        1
  •  0
  •   John Wu    7 年前

    您的方法必须将控制权返回给调用方,以便消息泵处理将呈现新文本的重新绘制事件。你有两个选择。

    老路

    void SomeHandler(object sender, EventArgs e)
    {
        int a, b;           
        int i=0;
        while(i<5)
        {
            i += 1;
            Thread.Sleep(1000);
            Application.DoEvents(); //Process events in the event queue
            label1.Text += "a";               
        }
        MessageBox.Show("done");
    }
    

    新途径

    要使其工作,必须使处理程序异步。

    async void SomeHandler(object sender, EventArgs e)
    {
        int a, b;           
        int i=0;
        while(i<5)
        {
            i += 1;
            await Task.Delay(1000);  //The await keyword yields control to the caller
            label1.Text += "a";               
        }
        MessageBox.Show("done");
    }
    

    后一种方法被认为是优越的。DoEvents几乎是普遍存在的 frowned upon 开发人员。

    推荐文章