| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Асинхронный режим приема данных через сокет. |
| Автор: Хоббит 9.5.2006, 11:06 | ||
| Конектюсь к серверу. Как отправлят сообщения и как принимать разобрался. Но проблема в другом. При асинхроном принятии данных, фуннкция которая запускается для обработки - работает в другом потоке, нежели остальное приложение и следовательно не может получить прямо доступ к его свойствам. То есть собщения я получаю, а вывести не могу. Вот пример
|
| Автор: Хоббит 9.5.2006, 15:21 |
| Проблема с приемом решается через свойство InvokeRequired тект бокса А вот как отправить... потому что данный вариант работает... сообщения через сокет на сервер льются.. а вот обратно никак ничего не приходит |
| Автор: Хоббит 10.5.2006, 14:40 |
| в том что вообще не приходит .... вот эта функция, кот в отдельном потоке ничего не принимает |
| Автор: mr.DUDA 10.5.2006, 18:02 |
| А у меня работает. То бишь данные приходят в буфер. |
| Автор: Хоббит 10.5.2006, 22:21 |
| а можно пример кодика? асинхронного.... я сделал синхронный прием.. проверяю наличие инфы каждую секунда и гружу если есть, все работает |
| Автор: mr.DUDA 11.5.2006, 10:53 |
| Твой пример - рабочий (за исключением записи в листбокс). С сокетами много не работал, а разбираться особо не хочется |
| Автор: Хоббит 11.5.2006, 11:10 |
| ... понял ... а не рабочесь примера в том, что он только 1 раз принимает данные асинхронно.. а потом замолкает |
| Автор: mr.DUDA 11.5.2006, 12:57 | ||
Ну так ты ведь только 1 раз Connect вызываешь, не будет же он без конца ответы принимать Или просто не все данные приходят ? Тогда нужно сделать цикл и вызывать socket.Receive до тех пор пока он не вернёт 0. З.Ы. ещё не мешало бы в конце ReceiveData добавить вызов socket.EndRecieve(), может в этом проблема. |
| Автор: albert21 13.5.2006, 22:47 | ||
А можно поподробнее? У меня схожая проблема, не могу добраться до грида |
| Автор: mr.DUDA 14.5.2006, 09:47 | ||
объясняю подробнее: 1) работать с визуальными контролами и формами из нескольких потоков нельзя, валится исключение InvalidOperationException при попытке вызвать практически любой метод или свойство 2) поток, желающий что-либо сделать с контролом/формой, должен вызвать у контрола/формы метод Invoke, передав ему делегат на любой метод 3) контрол/форма вызовут метод по делегату, причём этот метод уже будет работать в "родном" потоке контрола/формы, что позволит данному методу безопасно работать со свойствами и методами контрола/формы В двух словах, всё что нужно - это вызвать метод Invoke контрола (или формы) и передать ему делегат на метод, выполняющий всю работу. |
| Автор: ivashkanet 14.5.2006, 20:19 | ||
| mr.DUDA, неразу такого не делал, но вопрос все же интересен А как передеть значение из потока.... Писал, писал и подумал: "дай гляну на этот метод invoke", а там как раз все и написано:
Только вот что получается. Если метод планируестся вызываться в invoke, то метод заранее должен уметь переконвертить из object в реальный тип, или это конвертирование проходит автоматически? Опять поэкспериментировал и оказалось, что преобразование идет автоматом, хоть это радует P.S. Еще замечание. Получается компилятор не может проверить соответствие типов Даже не смог проверить количество аргументов Хм.. А зачем ему тогда нужено явно объявлять делегата Наверное, invoke всетки хитрый метод. И именно он автоматом конвертирует типы и проверяет количество аргументов, на основании полученного делегата |
| Автор: mr.DUDA 14.5.2006, 22:50 |
| ivashkanet, в Invoke можно передать делегат любого типа. Что мешает, например, передать делегат на метод, принимающий string или массив Rectangle-ов, или на Dictionary<string,int> и так даее ? В конце концов, можно объявить делегат с нужным набором аргументов. |
| Автор: ivashkanet 15.5.2006, 08:09 | ||||
mr.DUDA, эт я понял
|