![]() |
Ответ: Сетевое программирование
Можно твою функцию чтения сделать асинхронной - завернуть в обёртку, тогда получение не будет блокировать прогу.
Код:
static public async Task Boolean readSocket() |
Ответ: Сетевое программирование
Блокировка не важна. Вопрос чем заменить DataAvailable - например пришло сразу две строки, одну прочитали, DataAvailable сбросилось, вторая будет висеть и не прочитается пока не придет что-нибудь еще...
Что-то мне подсказывает, что от ReadLine() придется отказаться.:) |
Ответ: Сетевое программирование
Можно так: читать сокет в отдельном потоке в цикле. прочитанные строки отправлять в обработчик EventHandler.
Код:
public EventHandler<string> OnReadLine; Код:
socketWrapper.OnReadLine += (sender, args) => { отправку данных можно тоже делать в отдельном потоке, выгребая все команды из списка-на-отправку. |
Ответ: Сетевое программирование
Проблема вероятнее в том, что сервер не отправляет данные строки.
Попробуй установить на обоих сторонах вот этот флаг в True: https://msdn.microsoft.com/ru-ru/lib...vs.110).asp x |
Ответ: Сетевое программирование
Если как ты написал "блокировка не важна", то вся эта хрень с DataAvailable вообще не нужна.
Код:
var ns = tcpClient.GetStream(); Если тебе нужно асинхронно принимать данные по сети и "делить на строки", то подход нужен совсем другой - 1 поток просто всегда читает данные из tcpClient и записывает в буффер, 2 поток (можно и в основном), читает данные из буффера и делит на строки, если там какой-то кусок "неполный", то его надо оставить в буффере до тех пор пока остальное не придет. На самом деле и чтение из потока и обработку данных можно тоже в одном потоке делать, просто так делать не принято (хоть и будет работать) |
Ответ: Сетевое программирование
Всем спасибо.
В итоге сделал так, вроде работает без ошибок: :) PHP код:
|
Часовой пояс GMT +4, время: 07:41. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot