加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:50:19 所属栏目:百科 来源:网络整理
导读:我试图使用NetworkStream.ReadAsync()来读取数据,但是我找不到如何取消一旦调用的ReadAsync().对于背景,NetworkStream由连接的BluetoothClient对象(来自32Feet.NET蓝牙库)提供给我. 我正在尝试的当前工作代码如下. int bytesRead;while (this.continueReadin
我试图使用NetworkStream.ReadAsync()来读取数据,但是我找不到如何取消一旦调用的ReadAsync().对于背景,NetworkStream由连接的BluetoothClient对象(来自32Feet.NET蓝牙库)提供给我.

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

int bytesRead;

while (this.continueReading)
{
    bytesRead = await this.stream.ReadAsync(this.buffer,(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 with a cancellation token never cancels).

我已经尝试关闭基础流,这导致等待的ReadAsync调用抛出ObjectDisposedException,底层蓝牙连接也被关闭.理想情况下,我不想完全切断与设备的连接,只是为了停止阅读.它看起来不是一个干净的方法,并且不必为了中断va ReadAsync()调用而删除整个流.

任何建议?

解决方法

您可以在NetworkStream.Read(或ReadAsync)周围实现一个异步包装,它也会收到一个可以监视和兑现自己的canceltoken.这样的事情
Task MyCancelableNetworkStreamReadAsync(NetworkStream stream,CancellationToken ct)
{
...
if(this.stream.CanRead)
{
  do 
  {
    //check ct.IsCancellationRequested and act as needed
    bytesRead = await this.stream.ReadAsync(this.buffer,(int)this.buffer.Length);
  }
  while(myNetworkStream.DataAvailable);
}

请注意,我只是试图说明这个想法,你可能会考虑返回Task< TResult>,以及是否有do {} while循环,任何其他处理或清理等 – 都是根据你的需要.

我也会提请您注意Stephen Toub How do I cancel non-cancelable async operations?的文章和他在那里创建的WithCancellation扩展.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读