создавая задержку на silverlight - PullRequest
0 голосов
/ 11 ноября 2011

Я делаю пошаговую игру Silverlight (игра в карты). и я хочу задержаться между поворотами.

Я пробовал Thread.Sleep, но он останавливает мой пользовательский интерфейс. Я пытался использовать DispatcherTimer, но это забавно. иногда работает, иногда пропускает.

Мой код прекрасно работает с DipatcherTimer, когда я устанавливаю интервал в 3 секунды, но когда я устанавливаю интервал в 1 секунду, он начинает пропускать несколько раундов.

Есть ли другой способ создать эту задержку?

Обновление: я только что перезапустил свои окна, и какое-то время они работали идеально. Через час я попробовал еще раз, не меняя код, он начал пропускать! я не понимаю

1 Ответ

1 голос
/ 11 ноября 2011

Вы можете использовать класс System.Threading.Timer с пониманием того, что он использует потоки (как показано ниже).Таймер настраивается в конструкторе.Он начинается немедленно (третий параметр установлен на 0), а затем выполняется каждые 1000 мс (4-й параметр).Внутри код немедленно вызывает Dispatcher для обновления пользовательского интерфейса.Потенциальным преимуществом этого является то, что вы не связываете поток пользовательского интерфейса для занятой работы, которая может быть выполнена в другом потоке (например, без использования 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>
...