为关联NamedPipe的StreamReader添加using关键字后程序崩溃,原因何在?
问题原因分析
using语句块的核心作用是自动调用对象的Dispose()方法释放资源,当StreamReader被包裹在using块中时,代码执行到块末尾会自动销毁StreamReader实例。- 默认情况下,
StreamReader的Dispose()方法会同时关闭并释放它所关联的底层流(也就是你的NamedPipeClientStream)。 - 你的计时器后续还需要从这个
NamedPipeClientStream读取消息,但此时管道流已经被StreamReader的释放操作关闭了,后续对管道流的读写操作自然会引发异常,导致程序崩溃。
正确的处理方式
如果你想确保StreamReader的资源被正确管理,同时不影响后续管道流的使用,可以在实例化StreamReader时,传入第二个参数leaveOpen: true,这样StreamReader被释放时就不会关闭底层的管道流:
using (var reader = new StreamReader(pipeStream, Encoding.UTF8, true, 1024, leaveOpen: true)) { // 读取第一条消息的逻辑 } // 此时pipeStream仍然处于打开状态,计时器可以正常使用它
或者,如果你整个生命周期内都需要使用这个StreamReader,那就不要用using块,而是在整个管道流不再被使用时,手动调用StreamReader和NamedPipeClientStream的Dispose()方法。
内容的提问来源于stack exchange,提问作者user17370693
相关产品推荐
相关产品推荐

