C# 如何在事件处理程序中使用for循环
我是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);
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线程。关于堆栈溢出,已经有数千个问题解决了这类问题。关于两个最彻底的示例,请参见标记的副本。