C# 如何在事件处理程序中使用for循环

C# 如何在事件处理程序中使用for循环,c#,C#,我是C#新手,我想知道为什么如果我在按钮处理程序中有一个for循环,并且如果我尝试在标签中显示循环计数器,那么只会显示计数器的最后一个值。这方面有什么工作吗 private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 100; i++) { this.label1.Text = Convert.ToString(i);

我是C#新手,我想知道为什么如果我在按钮处理程序中有一个for循环,并且如果我尝试在标签中显示循环计数器,那么只会显示计数器的最后一个值。这方面有什么工作吗

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            this.label1.Text = Convert.ToString(i);
            Thread.Sleep(1000);
        }
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<100;i++)
{
this.label1.Text=Convert.ToString(i);
睡眠(1000);
}
}

Sleep方法阻止线程,从而阻止窗体处理允许屏幕更新的“绘制”消息

相反,使用异步处理程序和
Task.Delay

private async Task button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        this.label1.Text = Convert.ToString(i);
        await Task.Delay(1000);
    }
}
private async Task按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<100;i++)
{
this.label1.Text=Convert.ToString(i);
等待任务。延迟(1000);
}
}
根据我对C#的记忆,您可能已经更改了标签的文本,但没有给程序时间重新绘制控件。是刷新还是使其无效?如果是Delphi,您将丢失Application.ProcessMessages,我认为这是C#中的DoEvents()。您的
Thread.Sleep()
使您的循环实际上是一个“长时间运行的操作”。您正在阻止UI线程。关于堆栈溢出,已经有数千个问题解决了这类问题。关于两个最彻底的示例,请参见标记的副本。