我通过各自的TCP套接字异步提供各种TCP客户端。目前,我有3个任务同时运行:
NetworkStream
await StreamReader.ReadAsync()
的数据
NetworkStream
await StreamWriter.WriteAsync()
现在,当我打电话给这样的话时:
var stream = new NetworkStream(_socket);
// reading task
using (var reader = new StreamReader(stream)) {
// ...read...
}
基础NetworkStream
在完成阅读后最终会被销毁,因为StreamReader
会在Dispose()
上将其关闭。
最简单的方法是不关闭StreamReader
,但AFAIK这是一个非常糟糕的主意。那么,如何在保持套接字连接打开的同时处理异步读写?
答案 0 :(得分:2)
从.NET 4.5开始,如果查看StreamReader
和StreamWriter
的构造函数重载,则有一个(当前只有一个)构造函数采用bool leaveOpen
参数。使用此重载并传递true
- 然后它将感觉不到底层流的所有权。
如果您的框架版本无法使用此功能,则必须创建一个NonClosingStream : Stream
,使用pass-thru实现为除Close()
和Dispose()
之外的所有内容修饰流,应该是no-ops(好吧,他们可以将null
分配给代表包装流的字段,但仅此而已。)
答案 1 :(得分:0)
由于StreamReader
将始终自行处理下属流(这就是为什么 IDisposable
),你确实不得不关闭它直到你不再需要在网络流中了。
所以,这种情况非常好:
var stream = new NetworkStream(_socket);
var reader = new StreamReader(stream);
当你完成时,你会关闭它们,对吗?
reader.Dispose();
stream.Dispose();