TCP网络流处理

时间:2013-11-28 09:28:36

标签: c# .net sockets asynchronous tcp

我通过各自的TCP套接字异步提供各种TCP客户端。目前,我有3个任务同时运行:

  1. 使用NetworkStream
  2. 等待来自await StreamReader.ReadAsync()的数据
  3. 使用NetworkStream
  4. 将数据写入await StreamWriter.WriteAsync()
  5. 定期发送看门狗消息
  6. 现在,当我打电话给这样的话时:

    var stream = new NetworkStream(_socket);
    
    // reading task
    
    using (var reader = new StreamReader(stream)) {
        // ...read...
    }
    

    基础NetworkStream在完成阅读后最终会被销毁,因为StreamReader会在Dispose()上将其关闭。

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

2 个答案:

答案 0 :(得分:2)

从.NET 4.5开始,如果查看StreamReaderStreamWriter的构造函数重载,则有一个(当前只有一个)构造函数采用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();