如何取消 NetworkStream.ReadAsync 而不关闭流

2024-05-04

我正在尝试使用 NetworkStream.ReadAsync() 读取数据,但我找不到如何取消调用后的 ReadAsync() 。作为背景,NetworkStream 由连接的 BluetoothClient 对象(来自 32Feet.NET 蓝牙库)提供给我。

我正在尝试的当前工作代码如下。

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() 行。我不知道如何在不接收数据的情况下中止呼叫。

我知道 ReadAsync 存在过载,它提供了 CancellationToken,但似乎由于 NetworkStream 没有覆盖默认的 ReadAsync 行为,因此该令牌被忽略(请参阅带有取消令牌的 NetworkStream.ReadAsync 永远不会取消 https://stackoverflow.com/questions/12421989/networkstream-readasync-with-a-cancellation-token-never-cancels).

我尝试关闭底层流,这会导致等待的 ReadAsync 调用抛出 ObjectDisposeException,并且底层蓝牙连接也被关闭。理想情况下,我不想仅仅为了停止阅读而完全切断与设备的连接。这似乎不是一个干净的方法,并且感觉没有必要为了中断 va ReadAsync() 调用而拆除整个流。

有什么建议吗?


您无法取消 ReadAsync,因为内部调用不受托管并使用 IOCompletion 端口。您的选项如下。

  1. 使用 Socket.Shutdown()。这将返回 ReadAsync,并带有 OperationAborted 套接字错误。
  2. 等待读取超时。
  3. 从套接字读取数据之前检查数据是否可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取消 NetworkStream.ReadAsync 而不关闭流 的相关文章

随机推荐