Using a timer to update the UI Thread

In trying to write a Windows 10 Desktop application that refreshes an image on the screen within a timer; I had the following code:

                _timer = new Timer((data) =>
                {
                    if (_imgIdx > Images.Count)
                        _imgIdx = 0;
                    AnimatedImage = Images.ElementAt(_imgIdx);
                    _imgIdx++;
                }, null, 0, 300);

However, when I run this, I get an exception:

The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

My assumption was that the update was occurring on a different thread from the UI (a valid assumption I believe); so I, initially tried to call:

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;

However, this gave me a null exception.

DispatcherTimer

The answer is the DispatcherTimer class. Here’s how it’s used:

                _dispatcherTimer = new DispatcherTimer();
                _dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
                _dispatcherTimer.Tick += Dt_Tick;
                _dispatcherTimer.Start();

Dt_Tick can now update the UI thread.


        private void Dt_Tick(object sender, object e)
        {

From the naming convention, you might infer that _dispatcherTimer is a class level variable; that’s because it is. The reason is that you can stop the timer elsewhere in the code:

                _dispatcherTimer.Stop();

One thought on “Using a timer to update the UI Thread

Leave a Reply

Your email address will not be published. Required fields are marked *