この質問の@Len-Holgateのアドバイスに基づいて、0バイトの読み取りを非同期に要求し、コールバックで同期読み取りで使用可能なバイトを受け入れます。これは、データが使用可能でブロックされないことがわかっているためです。これはとても効率的で素晴らしいようです。
しかし、SslStream のオプションを追加すると、このアプローチは崩壊します。ゼロバイトの読み取りは問題ありませんが、SslStream はバイトを復号化し、TcpClient のバッファーにゼロのバイト数を残して (適切に)、読み取りに使用できる SslStream のバイト数を判断できません。
これに簡単なトリックはありますか?
コンテキストのためだけに、いくつかのコード:
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(...);
}
また、プロトコルのために、バイト単位で評価し、可変バイト幅の Unicode などをデコードする必要があります。バイト単位で非同期に読み取る必要はありません。