![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: нет Всего: 74 |
Всем привет! Хочу попросить помощи, а скорее даже объяснить мне неразумному...
Какая ситуация: был в консоли написан асинхронный сокетный сервер, который какие-то сообщения на консоль и выводил. Все было, как я понимаю, в одном потоке, и проблем доступа к Console.WriteLine() у сервера не возникало. Сейчас я все это дело обращиваю интерфейсом WindowsForms. Сервер ютится в отдельном классе, а в роли консоли работает RichTextBox, вывод в него идет так:
И когда сокетное соединение с клиентом пытается вызвать Form1.IncertToLog(receivedData); появляется исключение, что мол обращение к объекту не из того потока, в котором он был создан. К сожалению я никак не могу самостоятельно осознать устройство работы делегатов и событий, о которых мне говорили, что именно они могут помочь в решении моей проблемы. Как я предполагаю решать проблему с этим исключением: пусть сокетное соединение отправляет событие, что нужно что-то внести в log, а где-то на форме оно должно отлавливаться и выполнять InsertToLog(); Помогите пожалуйста, объясните механизм, как создать событие, откуда и как его вызвать и как словить в другом месте? -------------------- Всем добра ![]() |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 4 Всего: 59 |
Не мучайтесь... просто заставьте выполняться заветный код в основном потоке:
В WinForms у класса Control (от него все визуальные элементы наследуются) есть метод Invoke (плюс асинхронная пара BeginInvoke и EndInvoke), который ложит задачу в очередь выполнения основного потока. PS: Отойдя от темы, на вашем месте я бы оставил серверные части в покое и кинул бы их вообще как Windows Service. А WinForms приложение сделал бы отдельно, чтоб следить за работой сервера. Способов взаимодействия между "следилкой" и сервисом на сегодняшний достаточно, проблем с этим нет. Как самый самый простой вариант (но не профессиональный и уж тем более взаимодействием его тоже не назовешь), может быть таким: Сервер логирует все в файл (мне нравится log4net для таких целей). "Следилка" знает путь к папке логирования и при запуске цепляется к логам и загружает то, что уже есть на этот момент. Далее она устанавливает слежение за изменениями в той папке (FileSystemWatcher) и при изменении читает из лога и обновляет ЮИ. Чтоб было оптимально, надо после каждого чтения из лога запоминать позицию до которой прочитали в прошлый раз и при изменениях дочитывать из лога начиная с этой позиции. Но это не взаимодействие, а просто лого-читалка (в Far'е уже есть такая) ![]() -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
IRO |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 11.2.2011 Где: Новосибирск Репутация: 1 Всего: 1 |
||||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: нет Всего: 74 |
IRO, спасибо, я на досуге займусь изучением, но не думаю что без понимания работы делегатов и событий я это сильно пойму(хотя признаюсь, за день попыток понимания я что-то начал осознавать
![]() -Mikle-, просто огромное спасибо за подсказку о Invoke ^_^ Твое предложение о том, чтоб сервер бросить в сервис и с ним работать - это отличная идея, я изначально так и думал делать сервер без всякого UI, но пока решил на уровне палок и камней реализовать ![]() Спасибо, ребята! Заслуженные плюсики ![]() -------------------- Всем добра ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |