NetworkStream.ReadAsync() を使用してデータを読み取ろうとしていますが、一度呼び出された ReadAsync() をキャンセルする方法が見つかりません。背景として、NetworkStream は、接続された BluetoothClient オブジェクト (32Feet.NET Bluetooth ライブラリから) によって提供されます。
私が試している現在の作業コードは以下のとおりです。
int bytesRead;
while (this.continueReading)
{
bytesRead = await this.stream.ReadAsync(this.buffer, 0, (int)this.buffer.Length);
Console.WriteLine("Received {0} bytes", bytesRead);
}
Console.WriteLine("Receive loop has ended");
コードはデータを受信すると正常に動作し、continueReading フラグが false に設定されていてデータが受信されるとループを停止しますが、データが受信されるまで ReadAsync() 行を通過しません。データを受信せずに通話を中止する方法がわかりません。
CancellationToken を提供する ReadAsync のオーバーロードがあることは承知していますが、NetworkStream はデフォルトの ReadAsync 動作をオーバーライドしないため、トークンは無視されるようです (キャンセル トークンを使用した NetworkStream.ReadAsync を参照してください)。
基になるストリームを閉じようとしましたが、これにより、待機中の ReadAsync 呼び出しが ObjectDisposedException をスローし、基になる Bluetooth 接続も閉じられます。理想的には、読み取りを停止するためだけにデバイスとの接続を完全に切断したくありません。それを行うのはきれいな方法ではないようであり、va ReadAsync() 呼び出しを中断するためだけにストリーム全体を破棄する必要はないと感じています。
何かアドバイス?