NetworkStream.ReadAsync()を使用してデータを読み取ろうとしていますが、一度呼び出されたReadAsync()をキャンセルする方法が見つかりません。バックグラウンドでは、NetworkStreamは、(32Feet.NET Bluetooth Libraryの)接続されたBluetoothClientオブジェクトによって私に提供されます。ストリームを閉じることなくNetworkStream.ReadAsyncをキャンセルする方法
私が試している現在のget-it-workingコードは以下のとおりです。
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 with a cancellation token never cancels参照)。
基本ストリームを閉じようとしましたが、待機中のReadAsync呼び出しによってObjectDisposedExceptionがスローされ、基盤となるBluetooth接続も閉じられます。理想的には、読書を止めるためにデバイスとの接続を完全に切断したくないのです。これを行うのはきれいな方法ではなく、ストリーム全体を分解してReadAsync()呼び出しを中断する必要はありません。
アドバイスはありますか?
私はDataAvailableのチェックを忘れたいです!サンプルコードとStephen Toubの記事へのリンクをありがとう。どちらも私が後になったことを達成するのに役立ちます。ありがとう! – Swampie