c# - 我的秒表中出现 Thread Sleep 的问题
问题描述
我想制作一个百分比计数器,它会在 0.1 秒内增加 1,但事实证明程序完全变慢并且不显示计数器,而是显示它是如何变为 100%
for (double percent = 1; percent <= 100; percent++)
{
label5.Text = percent.ToString() + "%";
Thread.Sleep(100);
}
解决方案
这是因为 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 窗体计时器组件以设置的间隔运行过程。
有一个很好的例子正是你需要的。
推荐阅读
- mysql - sqlalchemy.exc.NoReferencedColumnError:无法初始化表 'post' 上 ForeignKey 'title.id' 的目标列
- build - 我正在尝试在 ace 编辑器中添加 php 自定义片段,但自定义片段在编辑器中不可用
- php - 如何在两个(yii2 基本)应用程序之间共享 Models 文件夹
- javascript - 由于浏览器设置而拒绝 sessionStorage 访问时该怎么办
- android - Android Studio 模拟器:VK_VERSION_1_1 检查失败
- javascript - 如何在第二次单击 jquery 时更改 SVG 填充颜色
- r - 如何在 R 中的箱形图中标记 Q1、中值、Q3 和异常值
- google-apps-script - 如何解密 StateTokenBuilder 返回的 createToken() 返回的状态令牌
- java - 如何使用 selenium webdriver 使隐藏的 div 可见
- excel - 如何使用 Range.Value 读取包含重音字母的 Excel 单元格?