UI не обновляет время, даже таймер в разных потоках - PullRequest
0 голосов
/ 05 июня 2019

Я запускаю два таймера в разных потоках (один работает 20 секунд, а другой - 1 секунду). Если таймер продолжительностью 1 секунда истек, свойство «Время» обновляется. Это свойство является привязкой для метки. Свойство обновляется правильно, но интерфейс обновляется только каждые несколько секунд.

Вот код для таймеров:

    public void InitializeAlarm()
    {
        Task.Run(() =>
        {
            var timer = new Timer();
            timer.Interval = 20000;// 21600000
            timer.Enabled = true;
            timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
            timer.AutoReset = true;
            this.Time = new TimeSpan(0, 0, 20);
            timer.Start();
        });

        Task.Run(() =>
        {
            var timerForCountDown = new Timer();
            timerForCountDown.Interval = 1000;// 21600000
            timerForCountDown.Enabled = true;
            timerForCountDown.Elapsed += new ElapsedEventHandler(UpdateCountDown);
            timerForCountDown.AutoReset = true;
            timerForCountDown.Start();
        });

    }

    private void UpdateCountDown(object sender, ElapsedEventArgs e)
    {
        this.Time = this.Time.Subtract(new TimeSpan(0, 0, 1));
    }

    private void TimerElapsed(object sender, EventArgs e)
    {
       //Do some stuff
    }

И вот связывание:

<Label Content="{Binding Time}" HorizontalAlignment="Left" FontSize="15"/>

1 Ответ

0 голосов
/ 06 июня 2019

Я создал секундомер и таймер в WPF раньше, и я нашел это решение самым простым из всех, что я пробовал.

Вместо использования разных потоков, просто создайте два DispatchTimers.Затем вы можете привязать вторую переменную к метке следующим образом:

Implement INotifyPropertyChanged;убедитесь, что у вас есть переменная секунд;

    private int _Seconds
    public int Seconds
    {
        get
        {
            return _Seconds;
        }
        set
        {
            _Seconds = value;
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(Seconds)));
            }
        }

    }

и добавьте привязку к вашему ярлыку в xaml

    Text="{Binding Seconds, UpdateSourceTrigger=PropertyChanged}"
...