2015-02-28 5 views
1

Я создаю сервер и клиент для чата, который работает на Tcp и Sockets, я хочу, чтобы клиент обрабатывал несколько соединений (для серверов), поэтому я создал класс под названием «Клиент» для управления соединением асинхронного, так что я могу запустить несколько экземпляров одновременно, как:Обновление GUI из другого класса в vb.net

Dim ConnectionToServer1 as new Client 
Dim ConnectionToServer2 as new Client 

Поскольку это асинхронное, когда происходит «соединение» принимает сообщение, оно генерирует событие (AsyncCallback), где Я могу преобразовать полученные байты в строку.

Проблема: я попытался установить эту строку в RichTextBox в моей форме изнутри класса Client, но ничего не происходит, я попытался создать делегат в коде формы, но ничего не работает, только путь, которым я смог поместить полученное сообщение в RichTextBox, создав общедоступную переменную, называемую LastMessage в классе Client, где хранится последнее сообщение (каждый раз, когда он получает сообщение, sub переопределяет строку), а затем запускает поток созданный формой, которая продолжает проверять данные (поскольку поток был создан формой, к которой у него есть доступ к элементам управления, включая RichTextBox, правильно?) Хотя я нахожу это немного неуклюжим, есть ли другой способ (через делегатов может быть?) Я могу это сделать?

Вот код: класс Клиент: http://pastebin.com/GF9um8Ss Код формы: http://pastebin.com/xW7mDj8j

ответ

0

Похоже, вы начали вниз все правильные пути.

В настоящее время в приложениях с резьбой одна из проблем, с которой вы столкнетесь, - это то, что у вас есть тонны рабочих потоков, но только основной поток пользовательского интерфейса может действительно делать какие-либо обновления для пользовательского интерфейса. Поэтому, учитывая это, если у вас есть асинхронный код, который необходимо обновить, вам нужно будет использовать то, что эффективно является делегатом.

Вы можете сделать это с помощью задач в наши дни намного проще, поэтому читайте в параллельной библиотеке задач, но по существу вам нужен делегат/задача, которая маршалируется для запуска в потоке ui для обработки обновлений пользовательского интерфейса.

+0

Спасибо вам столько Формы вашего времени! – user26302

+0

Нет проблем. Если мой ответ помог вам решить вашу проблему, отметьте ее как принятую, так что будущие исследователи знают, что это было полезно. – Tim

-1

Установить это глобальное свойство как ложные

Control.CheckForIllegalCrossThreadCalls = false 

это позволит вам редактировать любой контроль вашей формы из любого потока

+0

* НЕ ДЕЛАЙТЕ ЭТО * !!! Это 100% плохой, неправильный способ попытаться справиться с этим. Это только отключает другое предупреждение, а не основную проблему. – Tim

+0

@ Тим, вы можете объяснить, какие проблемы? – MrAlex6204

+0

Периодические сбои, зависания, синие экраны. Нет гарантии стабильности. Единственная причина, по которой этот параметр существует, это разрешить временную отладку проблем, это не предназначено для производственного кода. https://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls%28v=vs.110%29.aspx – Tim

Смежные вопросы