The application called an interface that was marshalled for a different thread - Windows Store App

Solution 1:

This solved my issue:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
    {
        // Your UI update code goes here!
    }
);

Correct way to get the CoreDispatcher in a Windows Store app

Solution 2:

Try replacing

messageList.Add(read); 

with

Dispatcher.Invoke((Action)(() => messageList.Add(read)));

If you're calling from outside your Window class, try:

Application.Current.Dispatcher.Invoke((Action)(() => messageList.Add(read)));

Solution 3:

Slight modification for task based async methods but the code in here will not be awaited.

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
    // Your UI update code goes here!
}
).AsTask();

This code WILL await, and will allow you to return a value:

    private async static Task<string> GetPin()
    {
        var taskCompletionSource = new TaskCompletionSource<string>();

        CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
        async () =>
        {
            var pin = await UI.GetPin();
            taskCompletionSource.SetResult(pin);
        }
        );

        return await taskCompletionSource.Task;
    }

And on Android:

    private async Task<string> GetPin()
    {
        var taskCompletionSource = new TaskCompletionSource<string>();

        RunOnUiThread(async () =>
        {
            var pin = await UI.GetPin();
            taskCompletionSource.SetResult(pin);
        });

        return await taskCompletionSource.Task;
    }