DispatcherTimer медленно становится быстрее в С# WPF

DispatcherTimers, которые, кажется, вызывают проблему, это openTimer и closeTimer. При первом включении они работают с правильной скоростью, однако впоследствии скорость постоянно увеличивается всякий раз, когда таймер запускается изнутри ToggleCharmsBar().

DispatcherTimer openTimer = new DispatcherTimer();
DispatcherTimer closeTimer = new DispatcherTimer();

private void ToggleCharmsBar()
{
    buttonA.IsEnabled = false;
    if (buttonA.Visibility == Visibility.Visible)
    {
        // Close charms bar
        buttonA.Opacity = 1;
        closeTimer.Tick += closeTimer_Tick;
        closeTimer.Interval = TimeSpan.FromMilliseconds(5);
        closeTimer.IsEnabled = true;
    }
    else
    {
        // Open charms bar
        buttonA.Visibility = Visibility.Visible;
        buttonA.Opacity = 0;
        openTimer.Tick += openTimer_Tick;
        openTimer.Interval = TimeSpan.FromMilliseconds(5);
        openTimer.IsEnabled = true;
    }
}

private void closeTimer_Tick(object sender, EventArgs e)
{
    // This timer speeds up with every call to ToggleCharmsBar()
    if (buttonA.Opacity < 0.02)
    {
        buttonA.Opacity = 0;
        buttonA.Visibility = Visibility.Hidden;
        buttonA.IsEnabled = false;
        closeTimer.IsEnabled = false;
    }
    else
    {
        buttonA.Opacity -= 0.02;
    }
}

private void openTimer_Tick(object sender, EventArgs e)
{
    // This timer also speeds up with every call to ToggleCharmsBar()
    if (buttonA.Opacity > 0.98)
    {
        buttonA.Visibility = Visibility.Visible;
        buttonA.Opacity = 1;
        buttonA.IsEnabled = true;
        openTimer.IsEnabled = false;
    }
    else
    {
        buttonA.Opacity += 0.02;
    }
}

Что может быть причиной этого?


person Callum Watkins    schedule 08.01.2015    source источник
comment
Подпишитесь на событие Tick только один раз. Как вы это делаете сейчас, каждый раз, когда вы вызываете toggleCharmsBar(), вы добавляете еще один обработчик событий, и обработчик событий Tick запускается несколько раз. Таким образом, он выглядит быстрее.   -  person Hans Passant    schedule 08.01.2015


Ответы (1)


Метод ToggleCharmsBar() снова вызывается? Убедитесь, что вы не назначаете дополнительный таймер. Это может быть причиной того, что он появляется быстрее. Когда на самом деле это просто дублированный таймер, который находится на другом тактовом цикле.

person Frank Sposaro    schedule 08.01.2015
comment
Как отмечает Ханс, создается не новый экземпляр Timer. Просто новый обработчик событий подписывается на существующий экземпляр Timer. Таким образом, метод обработчика событий openTimer_Tick() вызывается несколько раз при каждом такте таймера. - person Peter Duniho; 08.01.2015
comment
Это отличный звонок, спасибо всем за помощь ;) - person Callum Watkins; 08.01.2015