ZeroGS
ZeroGS

Reputation: 139

UWP IOT-Core App System.Exception: The application called an interface that was marshalled for a different thread

I'm stuck with an App that is running on Windows 10 IoT Core. All Classes are working fine, except for the one that is creating a CSV File via JSON and is supposed to send it as an Email.

When the Code reaches the "ReturnToMainPage()" Function the Exception "System.Exception: The application called an interface that was marshalled for a different thread" is thrown.

The "funny" thing is, the Mail is being send and i recieve it but the Program won't switch to back to the Main Page as intendet after sending the Email.

Here is the Code of the Class:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using EASendMail;

namespace PratschZahlstation
{
    public sealed partial class MailChoice : Page
    {
        private TextBlock _headerText;
        private ComboBox _mailComboBox;
        private Button _execute;
        private Button _abort;
        private EnDecode _coder = EnDecode.get_EnDecodeSingleton();
        private string _mailto = null;

        public MailChoice()
        {
            this.InitializeComponent();
            Init();
        }

        private void Init()
        {
            _headerText = HeaderText;
            _mailComboBox = MailAdresses;
            _mailComboBox.Items.Add("---");
            _mailComboBox.Items.Add("[email protected]");
            _mailComboBox.SelectedIndex = 0;
            _execute = DoFunction;
            _abort = DoExit;
        }

        private void DoFunction_Click(object sender, RoutedEventArgs e)
        {
            string selectedMail = this._mailComboBox.SelectedItem.ToString();

            if(selectedMail == "---")
            {
                _headerText.Text = "Bitte eine Emailadresse aus der Liste auswählen.";
            }
            else
            {
                _headerText.Text = "CSV wird erstellt und per Mail versendet!";
                _execute.IsEnabled = false;
                _abort.IsEnabled = false;
                _mailComboBox.IsEnabled = false;
                _mailto = selectedMail;
                DateTime date = DateTime.Now;
                string strippedDate = date.ToString("yyyy-MM-dd") + " 00:00:01";

                GetDataForCSV(strippedDate);
            }
        }

        private async void GetDataForCSV(string dateAsString)
        {
            string correctedDate = "2019-07-01 00:00:01";//dateAsString;
            string date = _coder.Base64Encode(correctedDate);

            HttpClient _client = new HttpClient();
            Uri _uri = new Uri("URI TO JSON-API");
            _client.BaseAddress = _uri;
            var request = new HttpRequestMessage(HttpMethod.Post, _uri);

            var keyValues = new List<KeyValuePair<string, string>>();
            keyValues.Add(new KeyValuePair<string, string>("mode", "10"));
            keyValues.Add(new KeyValuePair<string, string>("date", date));

            request.Content = new FormUrlEncodedContent(keyValues);

            var response = await _client.SendAsync(request);

            string sContent = await response.Content.ReadAsStringAsync();

            keyValues = null;

            if (sContent != null)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(sContent);
                string json = Encoding.UTF8.GetString(bytes);

                if (!json.Contains("success"))
                {
                    List<CSV_SQL_Json_Object> _Json = JsonConvert.DeserializeObject<List<CSV_SQL_Json_Object>>(json);
                    response.Dispose();
                    request.Dispose();
                    _client.Dispose();
                    if (_Json.Count == 0)
                    {

                    }
                    else
                    {
                        CreateCSV(_Json);
                    }
                }
                else
                {
                    List<JSON_Status> _Json = JsonConvert.DeserializeObject<List<JSON_Status>>(json);
                    _headerText.Text = "Es ist der Folgender Fehler aufgetreten - Errorcode: \"" + _coder.Base64Decode(_Json[0].success) + "\"\r\nFehlermeldung: \"" + _coder.Base64Decode(_Json[0].message) + "\"";

                        _Json.Clear();
                        response.Dispose();
                        request.Dispose();
                        _client.Dispose();
                }
            }
        }

        private async void CreateCSV(List<CSV_SQL_Json_Object> contentForCSV)
        {
            DateTime date = DateTime.Now;
            string csvName = date.ToString("yyyy-MM-dd") + ".csv";

            StorageFolder storageFolder = KnownFolders.MusicLibrary;
            StorageFile csvFile = await storageFolder.CreateFileAsync(csvName, CreationCollisionOption.OpenIfExists).AsTask().ConfigureAwait(false);

            await FileIO.WriteTextAsync(csvFile, "Column1;Column2;Column3;Column4;\n");

            foreach (var item in contentForCSV)
            {
                await FileIO.AppendTextAsync(csvFile, _coder.Base64Decode(item.Object1) + ";" + _coder.aesDecrypt(_coder.Base64Decode(item.Object2)) + ";" + _coder.aesDecrypt(_coder.Base64Decode(item.Object3)) + ";" + _coder.aesDecrypt(_coder.Base64Decode(item.Object4)) + "\n");
            }

            SendEmail(_mailto, csvName);
        }

        private async void SendEmail(string mailto, string csvName)
        {
            try
                {
                SmtpMail oMail = new SmtpMail("Mail");
                SmtpClient oSmtp = new SmtpClient();

                oMail.From = new MailAddress("[email protected]");

                oMail.To.Add(new MailAddress(mailto));

                oMail.Subject = "The Subject";

                oMail.HtmlBody = "<font size=5>MailText</font>";

                StorageFile file = await KnownFolders.MusicLibrary.GetFileAsync(csvName).AsTask().ConfigureAwait(false);

                string attfile = file.Path;

                Attachment oAttachment = await oMail.AddAttachmentAsync(attfile);

                SmtpServer oServer = new SmtpServer("mail.dummy.com");

                oServer.User = "dummyuser";
                oServer.Password = "dummypass";
                oServer.Port = 587;
                oServer.ConnectType = SmtpConnectType.ConnectSSLAuto;
                await oSmtp.SendMailAsync(oServer, oMail);

                }
                catch (Exception ex)
                {
                    string error = ex.ToString();
                    _abort.IsEnabled = true;
                }

            ReturnToMainPage(); //This is where the Error Happens
        }

        private void ReturnToMainPage()
        {
            this.Frame.Navigate(typeof(MainPage));
        }

        private void DoExit_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(MainPage));
        }
    }
}

Upvotes: 0

Views: 118

Answers (2)

Anran Zhang
Anran Zhang

Reputation: 7727

Like Tobonaut said, you can use the Dispatcher.RunAsync to call the Navigation, it worked.

But your problem may not be this.

I copied your code and reproduced your problem and found that you have problems with the calls to read and write files:

// Your code
StorageFile csvFile = await storageFolder.CreateFileAsync(csvName, CreationCollisionOption.OpenIfExists).AsTask().ConfigureAwait(false);

StorageFile file = await KnownFolders.MusicLibrary.GetFileAsync(csvName).AsTask().ConfigureAwait(false);

The Navigation will be work if you delete the .AsTask().ConfigureAwait(false).

Best regards.

Upvotes: 2

Tobonaut
Tobonaut

Reputation: 2485

This could be an Threading issue. Navigation is only possible on the main-Thread.

You may want to try to marshal the call in:

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

Source:

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

Upvotes: 3

Related Questions