Системные часы (основанные на System.Timers.Timer) зависают (но остальная часть пользовательского интерфейса WPF отвечает идеально) - PullRequest
0 голосов
/ 26 ноября 2018

В моем приложении WPF у меня есть системные часы, которые используются для отображения текущего времени.Он основан на System.Timers.Timer.

Код выглядит следующим образом:

У меня есть закрытый член в классе:

private System.Timers.Timer _timer;

В конструкторе класса:

_timer = new System.Timers.Timer(1000);
_timer.AutoReset = false;
_timer.Elapsed += TickClock;
_timer.Start();

Прошедший метод выглядит следующим образом:

private void TickClock(object sender, ElapsedEventArgs e)
{
    UiInvokeIfNecessary.Invoke(() =>
    {
        header_clock.Text = DateTime.Now.ToLongTimeString();
    });
    _timer.Start();
}

Когда UiInvokeIfNecessary.Invoke вызывает код в Диспетчере пользовательского интерфейса .

public static void Invoke(Action action)
{
    if (Application.Current == null)
    {
        action();
        return;
    }
    if (Application.Current.Dispatcher.CheckAccess())
        action();
    else
    {
        Application.Current.Dispatcher.Invoke(action, DispatcherPriority.Send);
    }
}

TextBlock header_clock в пользовательском интерфейсе выглядит следующим образом:

<TextBlock HorizontalAlignment="Left"  VerticalAlignment="Center" x:Name="header_clock" 
           Height="30" FontSize="21" Text="00:00:00" Margin="5,0,0,0"  />

После нескольких минут работы системы происходит странная вещь: часы замирают (часы не двигаются вперед).Я думаю, что поток пользовательского интерфейса занят, но все в пользовательском интерфейсе (кроме часов) работает отлично (навигация между экраном, нажатие кнопок и т. Д.).Похоже, что поток пользовательского интерфейса свободен.

В чем может быть проблема?

1 Ответ

0 голосов
/ 26 ноября 2018

Приложения WPF должны использовать DispatcherTimer, а не System.Timers.Timer.

...