Refresh UI mit einem Timer in WPF (mit BackgroundWorker?)

Wir haben eine Anwendung in WPF, die Daten über ObservableCollection anzeigt. Nach 5 Minuten möchte ich die Daten aktualisieren.

Ich dachte, ich könnte das @ verwendSystem.Timers.Timer Objekt für seinElapsed event und dann ein @ aufrufBackgroundWorker, um die Methode aufzurufen, mit der der Job gestartet wird. Die Methode befindet sich in einer ViewModel-Klasse.

Aber es scheint, dass es ein Problem mit den Threads gibt.

So habe ich es mit dem Dispatcher versucht, aber das Gleiche nochmal.

Hier ist mein (vereinfachter und nicht optimierter) Code:

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationController"/> class.
/// </summary>
public ApplicationController()
{
    CreateDefaultTabs();

    Timer timer = new Timer(20000); //20 secs for testing purpose.
    timer.AutoReset = true;
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(OnTimeBeforeRefreshElapsed);
    timer.Start();
}

private void OnTimeBeforeRefreshElapsed(object sender, ElapsedEventArgs e)
{
    Dispatcher.CurrentDispatcher.Invoke(new Action(() => { RefreshData(); }));
    Dispatcher.CurrentDispatcher.Invoke(new Action(() => { UpdateLayout(); }));
}

private void RefreshData()
{
    foreach (object tab in _tabItems)
    {
        if (tab is TitleDetailsView)
        {
            TitleDetailsViewModel vm = ((TitleDetailsView)tab).DataContext as TitleDetailsViewModel;
            vm.Refresh();
        }
    }
}

private void UpdateLayout()
{
    foreach (object tab in _tabItems)
    {
        if (tab is TitleDetailsView)
        {
            TitleDetailsViewModel vm = ((TitleDetailsView)tab).DataContext as TitleDetailsViewModel;
            vm.HandleGetTitleBySymbolResponse();
        }
    }
}

Wie soll ich vorgehen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage