我正在制作一个基于转弯的银光游戏(纸牌游戏)。我希望在转弯之间延迟。
我已经尝试过Thread.Sleep,但它会暂停我的UI。 我试过使用DispatcherTimer,但它很有趣。有时它会起作用,有时它会跳过。
当我将Interval设置为3秒时,我的代码与DipatcherTimer完美配合,但是当我将间隔设置为1秒时,它开始跳过几轮。
是否有其他方法可以创建此延迟?
更新:我刚刚重启了我的窗户,它运行了一段时间。一小时后,我再次尝试,不改变代码,它开始跳过!我不懂。
答案 0 :(得分:1)
您可以使用System.Threading.Timer类,并了解它使用线程(如下所示)。计时器在构造函数中设置。它立即启动(第三个参数设置为0),然后每1000ms执行一次(第4个参数)。在内部,代码立即调用Dispatcher来更新UI。这样做的潜在好处是,您不会为可以在另一个线程中完成的繁忙工作而占用UI线程(例如,不使用BackgroundWorker)。
using System.Windows.Controls;
using System.Threading;
namespace SLTimers
{
public partial class MainPage : UserControl
{
private Timer _tmr;
private int _counter;
public MainPage()
{
InitializeComponent();
_tmr = new Timer((state) =>
{
++_counter;
this.Dispatcher.BeginInvoke(() =>
{
txtCounter.Text = _counter.ToString();
});
}, null, 0, 1000);
}
}
}
<UserControl x:Class="SLTimers.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="txtCounter" Margin="12" FontSize="80" Text="0"/>
</Grid>
</UserControl>