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();
Clear, short, simply. Like it