首页 > 解决方案 > 我的秒表中出现 Thread Sleep 的问题

问题描述

我想制作一个百分比计数器,它会在 0.1 秒内增加 1,但事实证明程序完全变慢并且不显示计数器,而是显示它是如何变为 100%

for (double percent = 1; percent <= 100; percent++)
{
    label5.Text = percent.ToString() + "%";
    Thread.Sleep(100);
}

标签: c#

解决方案


这是因为 UI 在事件处理程序完成之前不会做任何事情。试试这个

await Task.Delay(100);

您还必须将async关键字添加到执行此调用的方法中。像这样的东西:

private async void MyButton_Click(object sender, EventArgs e)

另请参阅:异步编程(Microsoft Docs)

链接的文档说:

await 关键字是魔法发生的地方。它将控制权交给执行 await 的方法的调用者,并最终允许 UI 响应或服务具有弹性。


另一种方法是使用计时器。确保使用适合您所拥有的 UI 类型的计时器。例如,如果您正在使用 winforms,请使用System.Windows.Forms.Timer. 您必须为其添加一个Tick事件处理程序。在每个滴答声中,都会在 UI 线程上调用此处理程序。更新那里的标签(这次不是循环!)。在两个滴答声之间,UI 将响应。

另请参阅:如何:使用 Windows 窗体计时器组件以设置的间隔运行过程
                有一个很好的例子正是你需要的。


推荐阅读