C#/WPF 如何在循环之间等待但仍允许用户单击按钮(不需要)
C#/WPF How to wait between loops but still allow user button click (not required)
我正在创建一个纸牌游戏 Slap Jack,它有 1 个用户和 3 个计算机 "players"。当用户点击翻牌按钮时,计算机会一张一张地翻牌。
我正在努力解决如何让计算机 运行 延迟执行之间的问题。我现在有一个模拟计算机翻转的功能,但延迟仅适用于第一次翻转,因为其他两个紧随其后。这是我目前使用的代码:
foreach (var player in Players.Where(a => a.IsComputer()))
{
_player = player;
_dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
_dispatcherTimer.Tick += new EventHandler(OnTimedEvent);
_dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
_dispatcherTimer.Start();
}
其中 OntimedEvent 是处理计算机翻转以及停止 dispatcherTimer(这是一个全局字段)的函数,_player 是活动玩家。就像我说的,这会在 foreach 循环的第一次迭代时暂停,但不会在第二次或第三次迭代时暂停。我也尝试过使用 System.Timer class 但那是在创建第二个线程并且没有按我需要的那样工作。我在这里做错了什么或者有更好的方法吗?
编辑:
我想我意识到 DispatcherTimer 是怎么错的,因为它执行 foreach 循环下面的剩余代码,然后等待计时器结束。
我能够通过使函数异步并使用 await Task.Delay(2000);
而根本不使用计时器来解决这个问题
我正在创建一个纸牌游戏 Slap Jack,它有 1 个用户和 3 个计算机 "players"。当用户点击翻牌按钮时,计算机会一张一张地翻牌。
我正在努力解决如何让计算机 运行 延迟执行之间的问题。我现在有一个模拟计算机翻转的功能,但延迟仅适用于第一次翻转,因为其他两个紧随其后。这是我目前使用的代码:
foreach (var player in Players.Where(a => a.IsComputer()))
{
_player = player;
_dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
_dispatcherTimer.Tick += new EventHandler(OnTimedEvent);
_dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
_dispatcherTimer.Start();
}
其中 OntimedEvent 是处理计算机翻转以及停止 dispatcherTimer(这是一个全局字段)的函数,_player 是活动玩家。就像我说的,这会在 foreach 循环的第一次迭代时暂停,但不会在第二次或第三次迭代时暂停。我也尝试过使用 System.Timer class 但那是在创建第二个线程并且没有按我需要的那样工作。我在这里做错了什么或者有更好的方法吗?
编辑: 我想我意识到 DispatcherTimer 是怎么错的,因为它执行 foreach 循环下面的剩余代码,然后等待计时器结束。
我能够通过使函数异步并使用 await Task.Delay(2000);
而根本不使用计时器来解决这个问题