私はNetworkStream.BeginRead/EndReadをソケットからの非同期読み込みに使用しています。NetworkStream.EndReadが0バイトを返した後でもまだデータを受信していますか?
しかし、NetworkStream.EndRead()はソケットが閉じられていると思っていたが、時々BeginRead()を呼び出し続けると0が返されますより多くのデータを受け取る。
これは、ソケット/ NetworkStreamからのデータを連続的に読み取るための適切なループではありませんか?
void BeginContinousRead()
{
// Start the continous async read
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
// Continue reading more data and call this callback method again over and over, etc.
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
は、MSDNによると、私はより多くのデータがソケットで利用可能であるかどうかを判断するためにNetworkStream.DataAvailableプロパティを使用する必要がありますが、より多くのデータが後日届く可能性があるにもかかわらず、これはFALSEになります。
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
while (mStream.DataAvailable)
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
...しかしDataAvailableはFALSEになりませんし、その後、私の連続読み取りが停止し、決してそれ以上のデータを読み込むため、これは正しく動作しません:
たとえば、MSDNによると、これは私のコールバックする必要があります。
もう一方の端は、ソケットを閉じるか、私はソケットをクローズすることを選択するまで、データ読み出しを継続するための正しい非同期のアプローチは何ですか?
ありがとうございます - その後、適切なループは何ですか? BeginRead()を呼び出してEndRead()に0バイトを何度も何度も返すようにしますか? – SofaKng
私はちょうど私のリスニングソケットにtelnetingでこれをテストしました。そして、何らかの理由で、私がtelnetクライアントを切断しても例外がスローされることはありません... – SofaKng