Основываясь на совете @ Len-Holgate в этом вопросе , я асинхронно запрашиваю 0-байтовые чтения, а в обратном вызове принимаю байты доступных байтов с синхронным читает, поскольку я знаю, что данные доступны и не буду блокироваться. Это кажется таким эффективным и замечательным.
Но затем я добавляю параметр для SslStream, и подход разваливается. Нулевое чтение нормально, но SslStream расшифровывает байты, оставляя нулевой счетчик байтов в буфере TcpClient (соответственно), и я не могу определить, сколько байтов теперь доступно для чтения в SslStream.
Is есть ли здесь простой трюк?
Какой-то код, только для контекста:
sslStream.BeginRead(this.zeroByteBuffer, 0, 0, DataAvailable, this);
И после EndRead () (который правильно возвращает 0) DataAvailable содержит:
// by now this is 0, because sslStream has already consumed the bytes
available = myTcpClient.Available;
if (0 < available) // Never occurs
{
// this part can be distractingly complicated, but
// it's based on the available byte count
sslStream.Read(...);
}
И из-за протокола мне нужно оценить byte -побайтное и декодирование юникода переменной ширины байта и прочее. Я не хочу, чтобы мне приходилось читать побайтово асинхронно!