gpt4 book ai didi

c# - 如何在不关闭流的情况下取消 NetworkStream.ReadAsync

转载 作者:可可西里 更新时间:2023-11-01 08:25:07 24 4
gpt4 key购买 nike

我正在尝试使用 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() 行。我看不到如何在没有收到数据的情况下中止调用。

我知道 ReadAsync 有一个重载,它提供了一个 CancellationToken,但似乎由于 NetworkStream 没有覆盖默认的 ReadAsync 行为,因此 token 被忽略(参见 NetworkStream.ReadAsync with a cancellation token never cancels )。

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

有什么建议吗?

最佳答案

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

  1. 使用 Socket.Shutdown()。这将返回带有 OperationAborted 套接字错误的 ReadAsync。
  2. 等待读取超时。
  3. 在从套接字读取之前检查数据是否可用。

关于c# - 如何在不关闭流的情况下取消 NetworkStream.ReadAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com