Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, делегаты и события, C# 
V
    Опции темы
SoWa
Дата 19.2.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



Всем привет! Хочу попросить помощи, а скорее даже объяснить мне неразумному...
Какая ситуация: был в консоли написан асинхронный сокетный сервер, который какие-то сообщения на консоль и выводил. Все было, как я понимаю, в одном потоке, и проблем доступа к Console.WriteLine() у сервера не возникало.
Сейчас я все это дело обращиваю интерфейсом WindowsForms.
Сервер ютится в отдельном классе, а в роли консоли работает RichTextBox, вывод в него идет так:
Код

public static ArrayList log = new ArrayList();
...
public static void InsertToLog(String line)
        {
            log.Insert(0, line);
            LogList.Lines = (string[])log.ToArray(typeof(string));
            LogList.Refresh();
        }

И когда сокетное соединение с клиентом пытается вызвать Form1.IncertToLog(receivedData); появляется исключение, что мол обращение к объекту не из того потока, в котором он был создан.

К сожалению я никак не могу самостоятельно осознать устройство работы делегатов и событий, о которых мне говорили, что именно они могут помочь в решении моей проблемы.
Как я предполагаю решать проблему с этим исключением: пусть сокетное соединение отправляет событие, что нужно что-то внести в log, а где-то на форме оно должно отлавливаться и выполнять InsertToLog();

Помогите пожалуйста, объясните механизм, как создать событие, откуда и как его вызвать и как словить в другом месте?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
-Mikle-
Дата 19.2.2011, 14:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Не мучайтесь... просто заставьте выполняться заветный код в основном потоке:

Код

        public static void InsertToLog(String line)
        {
            LogList.BeginInvoke((Action)delegate
            {
                log.Insert(0, line);
                LogList.Lines = (string[])log.ToArray(typeof(string));
                LogList.Refresh();
            });
        }


В WinForms у класса Control (от него все визуальные элементы наследуются) есть метод Invoke (плюс асинхронная пара BeginInvoke и EndInvoke), который ложит задачу в очередь выполнения основного потока.

PS: Отойдя от темы, на вашем месте я бы оставил серверные части в покое и кинул бы их вообще как Windows Service. А WinForms приложение сделал бы отдельно, чтоб следить за работой сервера. Способов взаимодействия между "следилкой" и сервисом на сегодняшний достаточно, проблем с этим нет. Как самый самый простой вариант (но не профессиональный и уж тем более взаимодействием его тоже не назовешь), может быть таким:
Сервер логирует все в файл (мне нравится log4net для таких целей). "Следилка" знает путь к папке логирования и при запуске цепляется к логам и загружает то, что уже есть на этот момент. Далее она устанавливает слежение за изменениями в той папке (FileSystemWatcher) и при изменении читает из лога и обновляет ЮИ. Чтоб было оптимально, надо после каждого чтения из лога запоминать позицию до которой прочитали в прошлый раз и при изменениях дочитывать из лога начиная с этой позиции.
Но это не взаимодействие, а просто лого-читалка (в Far'е уже есть такая) smile Если хотите сделать именно консоль сервера, то могу предложить на выбор .NET Remoting, NetPipes, Mutex, MSMQ, да или те-же сокеты (если с другим совсем уж плохо)


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
IRO
Дата 19.2.2011, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.2.2011
Где: Новосибирск

Репутация: 1
Всего: 1



PM MAIL   Вверх
SoWa
Дата 19.2.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



IRO, спасибо, я на досуге займусь изучением, но не думаю что без понимания работы делегатов и событий я это сильно пойму(хотя признаюсь, за день попыток понимания я что-то начал осознавать smile)
-Mikle-, просто огромное спасибо за подсказку о Invoke ^_^
Твое предложение о том, чтоб сервер бросить в сервис и с ним работать - это отличная идея, я изначально так и думал делать сервер без всякого UI, но пока решил на уровне палок и камней реализовать  smile 

Спасибо, ребята! Заслуженные плюсики smile


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.