0

我正在制作一个基于回合的 Silverlight 游戏(纸牌游戏)。我想在转弯之间延迟。

我已经尝试过 Thread.Sleep,但它会停止我的 UI。我尝试使用 DispatcherTimer,但它的行为很有趣。有时它有效,有时它跳过。

当我将间隔设置为 3 秒时,我的代码与 DipatcherTimer 完美配合,但是当我将间隔设置为 1 秒时,它开始跳过一些回合。

有没有另一种方法来制造这种延迟?

更新:我刚刚重新启动了我的 Windows,它运行了一段时间。一小时后,我再次尝试,没有更改代码,它开始跳过!我不明白。

4

1 回答 1

1

您可以使用 System.Threading.Timer 类,并理解它使用线程(如下所示)。计时器在构造函数中设置。它立即启动(第三个参数设置为 0),然后每 1000 毫秒执行一次(第 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>
于 2011-11-11T13:51:29.513 回答