C# AnonymousPipeServerStream.Read()偶尔挂起在客户端出口
我有一个主程序和一个从程序,它们通过一对匿名管道进行交互 交互如下所示:C# AnonymousPipeServerStream.Read()偶尔挂起在客户端出口,c#,.net,windows,debugging,pipe,C#,.net,Windows,Debugging,Pipe,我有一个主程序和一个从程序,它们通过一对匿名管道进行交互 交互如下所示: Master创建两个匿名PipeServerStream Master启动客户机进程,将其.GetClientHandleAsString()提供给他 船长,处理好Clienthandle两条管道的复印件 Master将内容写入一个管道,并从另一个管道读取内容 有时主线程会从另一个线程(Process.Kill())强制终止从线程,并关闭两个管道对象 在非常罕见的情况下,在从机端接时,从主机侧块上的管道读取数据是无限期
- Master创建两个匿名PipeServerStream
- Master启动客户机进程,将其.GetClientHandleAsString()提供给他
- 船长,处理好Clienthandle两条管道的复印件
- Master将内容写入一个管道,并从另一个管道读取内容
- 有时主线程会从另一个线程(Process.Kill())强制终止从线程,并关闭两个管道对象
- m_状态=4(即关闭)
- m_clientHandle是一个闭合的句柄(根据SafeHandle._状态和!handle的输出)
- m_handle是一个打开的句柄,_state=6(即未关闭,即使管道对象已关闭,并且根据反编译,它应该调用m_handle.Dispose()):
0:000> !handle 1850 ff
Handle 0000000000001850
Type File
Attributes 0
GrantedAccess 0x120189:
ReadControl,Synch
Read/List,ReadEA,ReadAttr,WriteAttr
HandleCount 2
PointerCount 5
No object specific information available
我有点担心HandleCount是2,PointerCount是5
你知道哪里出了问题吗?我关上管子时,为什么主人的阅读手柄末端没有关上?尽管客户端终止,尽管我称之为DisposeloccopyofClientHandle,为什么管道没有破裂
我能做些什么来至少解决这个问题?可能只是执行线程。在读取线程上中断?。主进程中可能的事件序列,前面是线程编号:
- 1-即将调用Microsoft.Win32.UnsafentiveMethods.ReadFile(位于BinaryReader.ReadInt32内)
- 2-杀死从属过程并关闭管道手柄
- 3-win32管道句柄(现在已关闭)可用于其他管道(或文件或其他任何内容)
- 1-Microsoft.Win32.UnsafentiveMethods.ReadFile开始使用现在引用其他对象的旧句柄和块进行读取
不要在仍在使用句柄时关闭它们。如何启动子进程?bInheritHandles参数的值是什么?我没有明确指出它。但是我确实将管道句柄标记为可继承的(在AnonymousPipeServerStream的构造函数中),因为依赖关系最终取决于管道,您是否可以让需要管道的线程通过关闭所述管道触发的事件释放?只是一个想法。@jkff这是一个有趣的问题。你找到解决方案了吗?@arx不幸的是没有-解决方案是使用stdin/stdout传输回滚我的程序。线程。顺便说一句,中断在这里不起作用。
0:000> !handle 1850 ff
Handle 0000000000001850
Type File
Attributes 0
GrantedAccess 0x120189:
ReadControl,Synch
Read/List,ReadEA,ReadAttr,WriteAttr
HandleCount 2
PointerCount 5
No object specific information available