(UWP C#) Приложение обратилось к интерфейсу, относящемуся к другому потоку

Нашел пример реализации консольного TCP-чата на С# и решил попробовать перенести его клиент на UWP. В примере было два приложения, клиентское и серверное. В качестве сервера я использую серверное консольное приложение из примера и подключаюсь к нему с помощью UWP-клиента, вместо консольного из примера. Но суть не в этом.
Суть в следующем. Имеется метод ReceiveMessage():

public void ReceiveMessage()
    {
        while (true)
        {
            try
            {
                byte[] data = new byte[64];
                StringBuilder builder = new StringBuilder();
                int bytes = 0;
                do
                {
                    bytes = SettingsPage.stream.Read(data, 0, data.Length);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (SettingsPage.stream.DataAvailable);

                ChatPage.Message = builder.ToString();                  
                //MessageWriterAsync(ChatPage.Message);
                
            }
            catch
            {
                ChatPage.Message = "Подключение прервано";
                ChatPage.DisconnectRequest();
            }
        }

    }

Данный метод я использую для получения сообщения и он работает в потоке, который в свою очередь запускается при подключении к серверу. При получении сообщения я выполняю код MessageWriterAsync(string MessageToWrite), в который сообщаю строку Message из ChatPage:

public async void MessageWriterAsync(string MessageToWrite)
    {
        ChatPage Ch = new ChatPage();


        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            while (true)
            {
                if (MessageToWrite != "")
                {
                    Ch.boxChat.Text = MessageToWrite;
                }
            }
        });
    }

который будет записывать полученное сообщение (переменная Message) в TextBox по имени boxChat. Но, к моему сожалению, это не работает( Если убрать комментирование в методе ReceiveMessage() перед вызовом MessageWriterAsync я получаю исключение

[![Исключение][1]][1]

Помогите, пожалуйста(((
Объясните чайнику, что он делает не так?


UPD 9.01.2020 19:10

Прибиндил строковую переменную ChatHistory к boxChat.Text, для чего создал отдельный класс Strings в папке Resources:

public class Strings : INotifyPropertyChanged
    {
        private string _ChatHistory;
        public string ChatHistory 
        {

            get { return _ChatHistory; } 
            
            set
            {
                if (_ChatHistory != value)
                {
                    _ChatHistory = value;
                    OnPropertyChanged("ChatHistory");
                }
            } 

        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }

    }

Затем в XAMLе страницы с boxChat добавил

<Page ...
    ...
    xmlns:local="using:MyNamespace.Resources"
    ...
    <Page.DataContext>
        <local:Strings ChatHistory="История чата" />
    </Page.DataContext>
    <Grid>
    <TextBox x:Name="boxChat" Text="{Binding ChatHistory}"/>
    </Grid>
</Page>

а в коде этой страницы добавил:

   public ChatPage()
        {
            this.InitializeComponent();
            this.DataContext = new Strings { ChatHistory = "История чата" };
            connected = false;
        }
   ...
   public void AddString(string String)
        {
            Strings strings = this.DataContext as Strings;
            strings.ChatHistory += "\r\n" + String;
        }
   ...

Затем я немного изменил ReceiveMessage()

   void ReceiveMessage()
        {
            while (true)
            {
                try
                {
                    byte[] data = new byte[64];
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);

                    string message = builder.ToString();
                    Strings StringsLink = new Strings();
                    StringsLink.ChatHistory += "\r\n" + message;

                }
                catch
                {

                }
            }
        }

Теперь при вызове AddString (например при нажатии кнопки) мой boxChat обновляется и добавляет условную строку string. Но при получении сообщения с помощью Receivemessage() моя строка Chathistory получает значение message но boxChat почему-то не обновляет это значение. Буду копать дальше.


Ответы (0 шт):