Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# UWP The application called an interface that was marshalled for a different thread

I have a C# UWP app that contains a function I want to call every 5 seconds. The function runs fine when called from a button, and the Timer write to the debug console fine every 5 seconds....When I call the function from the Timer, all heck breaks loose. I get this:

System.Exception was unhandled by user code HResult=-2147417842 Message=The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

like image 952
Faust Avatar asked Dec 20 '16 01:12

Faust


1 Answers

I assume your function touches the app's UI. Anything which touches the UI needs to run on the UI's dispatcher thread (most apps will have only one until you get into multiple window apps).

You can use a Windows.UI.Xaml.DispatcherTimer to run your timer on the dispatcher thread.

If you need to run code on a worker thread and then touch UI on the dispatcher thread you can call Dispatcher.RunAsync to marshal a call back onto the dispatcher thread.

You can generally find your dispatcher from your Window via Window.Dispatcher.

var ignored = Window.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
   // Do something on the dispatcher thread
});
like image 87
Rob Caplan - MSFT Avatar answered Oct 03 '22 23:10

Rob Caplan - MSFT