这次写代码出现了这样一个问题,
await Task.Delay(1000 * 60 * 60); // 等待 1 小时
使用了这样一条语句,执行时发现UI界面的运行时间不更新了,于是查找资料,更改代码为下:
for (int j = 0; j < 2 * 60 * 60; j++) // 总共循环 7200 次 { await Task.Delay(500); // 每次延迟 500 毫秒 }
这次显示又正常了。于是总结了一下原因。
使用 for
循环:
当需要在延迟过程中进行额外操作时(如定时检查、更新 UI、响应外部信号)。
例如:实现一个定时任务,每 500 毫秒检查是否需要停止
使用单次延迟:
当只需要单纯等待一定时间,不需要任何额外操作时。
例如:模拟一个简单的定时器。
两者区别如下
两者主要区别
时间粒度
for
循环:每次只延迟 500 毫秒,循环中间可以插入其他操作,比如检查某个条件、更新状态等。
单次延迟:直接延迟 1 小时,整个过程是不可分割的。
响应性
for
循环:在每次 500 毫秒的间隔中,你可以执行其他逻辑,比如判断是否需要提前终止循环(例如通过检查取消标志 CancellationToken
)。
单次延迟:在整个 1 小时内程序是“休眠”状态,没有机会处理其他任务。
性能
单次延迟:性能更高,因为没有循环的额外开销。
for
循环:性能稍逊,但灵活性更高。