我正在尝试使用 NetworkStream.ReadAsync() 来读取数据,但我找不到如何在调用后取消 ReadAsync()。作为背景,NetworkStream 由连接的 BluetoothClient 对象(来自 32Feet.NET 蓝牙库)提供给我。
我正在尝试的当前 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 cancelation token never cancels )。
我已经尝试关闭底层流,这会导致等待 ReadAsync 调用抛出 ObjectDisposedException,并且底层蓝牙连接也被关闭。理想情况下,我不想仅仅为了停止阅读而完全切断与设备的连接。这似乎不是一种干净的方式,并且感觉没有必要仅仅为了中断 va ReadAsync() 调用而拆除整个流。
有什么建议吗?