Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как TextBox и компорт сделать в одном потоке?

Говорит что TextBox в другом потоке чем сама программа.
Белеберда, данные получает отлично и я их вижу через консоль. а выводить в текстбокс отказывается,

MainWindow()
{
    var port = new System.IO.Ports.SerialPort("COM2");
    port.DataReceived += (port, e)=>{ AddText(port.ReadExisting().ToString()); };
}

void AddText(string message)
{
    textbox.AppendText(message);//TextBox  --- ERRRRRROR
    // Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
}

PS WPF, FW 4 Client, VisualStudio 2013 Pro Upd4. W8.1
  • Вопрос задан
  • 4487 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Sumor
Нужно переключиться, по необходимости, в поток, которому принадлежит TextBox.
Для проверки используется функция CheckAccess(). Её нет в Intellisence (то есть в автодобавлении), но она нормально компилируется.
Если вы находитесь не в нужном потоке, то для вызова кода в нужном используется функция Invoke, от объекта Dispatcher того объекта, в потоке которого нужно выполнить код.
Код примерно такой (возможны синтаксические ошибки - нет под рукой студии):
void AddText(string message)
{
   if (!textbox.CheckAccess())
   {
       textbox.Dispatcher.Invoke(new Action<string>(AddText), message);
   }
   else
   {
       textbox.AppendText(message);
   }   
}
Ответ написан
GavriKos
@GavriKos
Вы не верите в те ошибки, которые вам показал компилятор?
Ответ написан
benbor
@benbor
Помог ответ - не забудь лайкнуть
В смысле белеберда? Так устроен wpf. Некоторые объекты ( в том числе гуи элементы) можно менять только в том потоке, в котором они были созданы. Читали мне это в универе давно, механизм точный, который вам поможет, не вспомню
Вот, что есть в гугле stackoverflow.com/questions/11358647/how-to-access...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы