首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP网络流处理

TCP网络流处理
EN

Stack Overflow用户
提问于 2013-11-28 09:28:36
回答 2查看 365关注 0票数 2

我通过各种TCP客户端各自的TCP套接字异步地服务它们。目前,我有三个任务同时运行:

  1. 使用NetworkStream等待来自await StreamReader.ReadAsync()的数据
  2. 使用NetworkStream将数据写入await StreamWriter.WriteAsync()
  3. 定期发送看门狗消息

现在,当我这样说的时候:

代码语言:javascript
复制
var stream = new NetworkStream(_socket);

// reading task

using (var reader = new StreamReader(stream)) {
    // ...read...
}

底层NetworkStream在读取完成后最终被销毁,因为StreamReaderDispose()上关闭了它。

最简单的方法是不关闭StreamReader,但是AFAIK --这是一个非常糟糕的主意。那么,如何在保持套接字连接打开的同时处理异步读写呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-28 09:32:04

从.NET 4.5开始,如果查看StreamReaderStreamWriter的构造函数重载,就会有一个(目前只有一个)构造函数接受bool leaveOpen参数。使用这个重载并传递true -这样它就不会感觉到底层流的所有权了。

如果这在框架版本中不可用,那么您必须创建一个NonClosingStream : Stream,它使用pass实现来装饰流,除了Close()Dispose()之外,这应该是无操作的(好吧,他们可以将null分配给表示包装流的字段,但仅此而已)。

票数 2
EN

Stack Overflow用户

发布于 2013-11-28 09:32:25

由于StreamReader总是根据自己的处理方式处理底层流(这就是为什么实际上是 IDisposable),所以在不再需要网络流之前,您确实不需要关闭它。

所以,这种情况是很好的:

代码语言:javascript
复制
var stream = new NetworkStream(_socket);
var reader = new StreamReader(stream);

当你完成的时候,你会关闭他们两个,对吗?

代码语言:javascript
复制
reader.Dispose();
stream.Dispose();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20262212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档