Интервал таймера Windows Phone не соответствует - PullRequest
1 голос
/ 29 декабря 2011

Я хочу создать приложение для Windows Phone, используя C #. Я хочу иметь таймер, который показывает одно изображение в течение 100 миллисекунд, затем переключается на другое изображение, а затем ждет еще 900 миллисекунд, прежде чем оно снова начнет мигать. У меня есть код ниже написано, однако, он не мигает постоянно. Есть идеи?

public partial class MainPage : PhoneApplicationPage
{
    DispatcherTimer timer = new DispatcherTimer();
    List<string> files = new List<string>() { "Images/off-light.png", "Images/on-light.png" };
    List<BitmapImage> images = new List<BitmapImage>();
    int current = 0;

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        foreach (string file in files)
        {
            BitmapImage image = new BitmapImage(new Uri(file, UriKind.Relative));
            images.Add(image);
        }


            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(900);
            timer.Tick += new EventHandler(timer_Tick);

    }

    void timer_Tick(object sender, EventArgs e)
    {
        myImage.Source = images[current];
        current++;
        if (current >= files.Count)
        {
            current = 0;
            timer.Interval = TimeSpan.FromMilliseconds(100);
            timer.Stop();
            timer.Start();
        }
        else
        {
            timer.Interval = TimeSpan.FromMilliseconds(900);
            timer.Stop();
            timer.Start();
        }

    }

    private void btnStop_Click(object sender, RoutedEventArgs e)
    {
        timer.Stop();
        myImage.Source = images[0];
    }

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        timer.Start();
    }
}

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Документация DispatchTimer гласит:

Таймеры не гарантированно будут работать точно, когда наступит временной интервал, но они гарантированно не выполнятся до того, как временной интервал наступит. Это связано с тем, что операции DispatcherTimer помещаются в очередь Dispatcher, как и другие операции. Время выполнения операции DispatcherTimer зависит от других заданий в очереди и их приоритетов.

Я не знаю, является ли это причиной вашей проблемы, так как я никогда не работал с DispatchTimer.

У вас есть другие варианты таймеров. Например, вы можете использовать System.Timers.Timer или System.Threading.Timer (который я рекомендую использовать вместо System.Timers.Timer). Обратите внимание, что если вы используете один из этих таймеров, обратный вызов будет выполняться в потоке пула, и вам нужно будет синхронизировать доступ к потоку пользовательского интерфейса. Снова из DispatchTimer документации:

Если в приложении WPF используется System.Timers.Timer, стоит отметить, что System.Timers.Timer работает в другом потоке, чем поток пользовательского интерфейса (UI). Чтобы получить доступ к объектам в потоке пользовательского интерфейса (UI), необходимо опубликовать операцию в диспетчере потока пользовательского интерфейса (UI) с помощью Invoke или BeginInvoke. Причины использования DispatcherTimer в отличие от System.Timers.Timer заключаются в том, что DispatcherTimer работает в том же потоке, что и Dispatcher, и DispatcherPriority можно установить в DispatcherTimer.

Возможно, вы захотите увеличить приоритет вашего таймера?

0 голосов
/ 29 декабря 2011

Я не очень хороший парень в winforms / wpf / silverlight, но я бы сказал, что вам нужно сделать окно недействительным.

вызовите любой метод, необходимый для обновления рендеринга, так как я думаю, что изменение исходного изображения не вызывает обновления

...