views:

45

answers:

1

Hi, guys.

Here's my concern.

We have an application in WPF that shows data via ObservableCollection. After 5 minutes, I want to refresh the data.

I thought I could use the System.Timers.Timer object for its Elapsed event and then call a BackgroundWorker to call the method that starts the job. The method is on a ViewModel class.

But it seems that there's a problem the threads.

So I tried with the Dispatcher, but same thing again.

Here's my (simplified and not optimized) 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();
            }
        }
    }

Any suggestions on how I should proceed?

+3  A: 

Why not use a DispatcherTimer? That will "tick" in the dispatcher thread already.

Beyond that, it's hard to say what's wrong just from your description of "there's a problem with the threads".

Jon Skeet
Wow, seriously you deserve your 230k points... Thank you very much!
esylvestre
Seriously, I need to get your low-hanging-fruit notification algorithm.
Will