如何在Tap手势执行后添加暂停?单人游戏人机回合间隔实现
解决方案
核心问题在于你之前用Thread.Sleep阻塞了UI线程,导致玩家操作的UI渲染被延迟到整个Tap事件执行完毕才进行。下面是具体的修复方案:
1. 用异步等待替代线程休眠
放弃Thread.Sleep,改用Task.Delay实现异步等待,这样不会阻塞UI线程,让玩家的移动操作能立刻完成渲染。同时配合Task.Yield()确保UI线程优先处理完当前渲染任务。
修改后的Tap事件代码:
_tapGestureRecognizer.Tapped += async (s, e) => { var boardcell = (BoardCell)s; if (boardcell.GamePiece.Fill == null) { var isMoveValid = MakeMove(boardcell); if (!GameViewModel.Game.IsTwoPlayer && isMoveValid) { // 让UI线程先完成玩家移动的渲染 await Task.Yield(); // 设置暂停时长(这里是1000毫秒,可根据需求调整) await Task.Delay(1000); // 执行电脑回合 await ComputerMoveAsync(); } } };
2. 重构ComputerMove为异步方法
把电脑移动逻辑抽离成独立的异步方法,如果涉及AI思考这类耗时操作,要放到后台线程执行,避免卡顿UI:
private async Task ComputerMoveAsync() { // 在后台线程执行AI计算,不阻塞UI var bestMove = await Task.Run(() => CalculateComputerBestMove()); // 回到UI线程执行移动操作,更新界面 Dispatcher.Dispatch(() => { // 这里写电脑移动的具体逻辑,比如调用对应方法更新棋盘 ApplyComputerMove(bestMove); }); }
关键原理
Task.Yield()会让UI线程先处理队列里的渲染任务,确保玩家的移动立刻显示在屏幕上。Task.Delay()是异步等待,期间UI线程可以继续响应其他操作,不会出现冻结。- 耗时的AI计算放到
Task.Run中,避免占用UI线程导致界面卡顿。
内容的提问来源于stack exchange,提问作者Aaron White
相关产品推荐
相关产品推荐

