簡體   English   中英

UWP IOT-Core App System.Exception:該應用程序調用了一個已編組為不同線程的接口

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

我對Windows 10 IoT核心版上運行的應用程序感到困惑。 除通過JSON創建CSV文件並應以電子郵件形式發送的文件外,所有類均工作正常。

當代碼到達“ ReturnToMainPage()”函數時,將引發異常“ System.Exception:名為接口的應用程序已編組為另一個線程”的應用程序。

“有趣”的事情是,正在發送郵件,並且我已經收到了郵件,但是在發送電子郵件之后,程序不會像預期的那樣切換回主頁。

這是該類的代碼:

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("dummy@mail.com");
            _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("noreply@dummy.com");

                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));
        }
    }
}

這可能是線程問題。 導航只能在主線程上進行。

您可能想嘗試將呼叫編組為

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

資源:

該應用程序調用了已編組為不同線程的接口-Windows Store App

就像Tobonaut所說的那樣,您可以使用Dispatcher.RunAsync調用Navigation ,它起作用了。

但是您的問題可能不是這個。

我復制了您的代碼並重現了您的問題,發現您的讀寫文件調用存在問題:

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

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

如果刪除.AsTask().ConfigureAwait(false) ,導航將起作用。

最好的祝福。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM