используйте AutoResetEvents для уведомления нужных потоков о том, что ответ готов к обработке.
Могу ли я предложить потокобезопасную очередь?BlockingCollection<T>
или BufferBlock<T>
?
Я установил значение ReceiveTimeout на 5 секунд, и хотя никто не отправлял данные на сервер, тайм-аут приема помог мне отправить сообщение ping на сервер.
Это странно.Я предполагаю, что весь протокол основан на пинг-понге, иначе использование приема таймаута до отправки сообщений не будет работать.
моя идея заключается в использованиипул сокетов и ReceiveAsync с SocketAsyncEventArgs на сокетах
Если вы не можете использовать async
/ await
, я бы посоветовал переключиться на стиль Begin*
/ End*
асинхронного API,Переход от синхронного к SocketAsyncEventArgs
- прыжок;SocketAsyncEventArgs
является наиболее сложной формой программирования сокетов async
.
есть ли другой способ, кроме таймера для отправки моих пинг-сообщений
Я бы порекомендовалтаймер;это нормальное решение для сообщений сердцебиения.Нужная семантика должна быть такова: «мы хотим отправлять данные хотя бы так часто».Поэтому используйте таймер, который можно сбросить при отправке обычных сообщений (без получения сообщений).
при использовании ReceiveAsync, могу ли я по-прежнему использовать обычную отправку для отправки данных или мне нужно использовать SendAsync?
Вы должны иметь возможность использовать синхронный для одного потока и асинхронный для другого.Я никогда не пробовал это, хотя;все системы, над которыми я работал, полностью асинхронны.
, когда ReceiveAsync не получает все необходимые данные, могу ли я использовать Receive для чтения оставшейся части или лучше снова использовать ReceiveAsync длянедостающие данные?
Этот вопрос не имеет для меня особого смысла.Если вы читаете асинхронно, вы не должны блокировать вызывающий поток.
Кроме того, я думаю, что этот вопрос сформулирован с неправильной точки зрения.Кажется, что код хочет «получить следующее сообщение», но это проблемный способ приблизиться к чтению из сокета.Вместо этого я рекомендую, чтобы в вашем коде был цикл, который бесконечно считывает данные из сокета и передает эти данные другому типу, который буферизует их по мере необходимости и выталкивает сообщения по окончании.
Известно ли это поведение при отладке IIS-процесса под нагрузкой?
Я бы не ожидал, но у меня нет большого опыта нагрузочного тестирования IIS.