c# - 如何在C#中延迟执行任务中的部分代码
问题描述
我有这种方法,我需要暂停一段时间。这是我尝试过的:
private async void btnStart_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() =>
{
this.Dispatcher.Invoke((Action)(() =>
{
NewGame();
// Game Loop
for (int i = 0; i < 35; i++)
{
int index = _random.Next(0, _numbersInGame.Count);
int number = _numbersInGame.ToArray()[index];
lblCurrentNumber.Content = number.ToString();
Task.Delay(1000).Wait(); // I want to add pause here
(this.FindName($"lblNum{i + 1}") as Label).Content = number.ToString();
lblCurrentNumber.Content = "";
_numbersInGame.RemoveAt(index);
}
}));
});
}
欢迎任何帮助。谢谢!
解决方案
- 您无需将其卸载到任务(使用
Task.Run
) - 由于您没有卸载,因此您不需要使用
Invoke
. - 鉴于上述情况,您可以惯用地
await
a而Task.Delay
不会阻塞UI
例子
private async void btnStart_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 35; i++)
{
NewGame();
int index = _random.Next(0, _numbersInGame.Count);
int number = _numbersInGame.ToArray()[index];
lblCurrentNumber.Content = number.ToString();
await Task.Delay(100);
(this.FindName($"lblNum{i + 1}") as Label).Content = number.ToString();
lblCurrentNumber.Content = "";
_numbersInGame.RemoveAt(index);
}
}
像这样使用 async 和 await 模式可以让您安全地更新 UI,因为延续将被发送回 UI 上下文。它还允许消息泵/调度程序继续有增无减,直到等待的延迟完成。
最后,您可能希望保护此方法免受带有标志或类似内容的双击(因为 ui 可以自由重新输入)
推荐阅读
- perl - 如何使 uc() 在 Perl 中像 toupper() 在区域感知 POSIX 环境中一样在 AWK 中工作?
- java - 尝试代码时出现此错误:线程“main”java.lang.NullPointerException 中的异常。有人能帮我吗?
- javascript - 我可以在 mat-expanded 行中显示另一个表吗?
- python-3.x - S3 Python列出嵌套的子目录
- reactjs - gapi.client.load() 在我的科尔多瓦应用程序的登录功能中不起作用
- ruby-on-rails - 如何修复 Heroku 中的“客户端请求中断”错误(使用 rails 应用程序)?
- css - 如何使折叠的导航菜单向下打开
- regex - 如何匹配多个可选组中的至少一个?
- sql-server-2014 - 具有窗口函数的时间戳之间的最小差异
- java - org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.app.entites.LDetails