我有一个主程序和一个程序,通过一对匿名管道进行交互。
交互看起来像这样:
在非常罕见的情况下,在奴隶终止时,从主人的管道读取无限期地阻塞 - 或有时肯定(例如几分钟)。我无法在本地计算机上重现它,但它不时发生在一个大型集群上。
我抓住了这种情况的转储,这就是我所看到的:
被阻止的主人的Stacktrace(我100%确定此时客户端进程已经终止):
000000000c83e488 000000007700fdba [NDirectMethodFrameStandalone: 000000000c83e488] Microsoft.Win32.UnsafeNativeMethods.ReadFile(Microsoft.Win32.SafeHandles.SafePipeHandle, Byte*, Int32, Int32 ByRef, IntPtr)
000000000c83e430 000007feeab32820 DomainBoundILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafePipeHandle, Byte*, Int32, Int32 ByRef, IntPtr)*** WARNING: Unable to verify checksum for System.Core.ni.dll
000000000c83e540 000007feeac14574 System.IO.Pipes.PipeStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafePipeHandle, Byte[], Int32, Int32, System.Threading.NativeOverlapped*, Int32 ByRef)
000000000c83e5a0 000007feeac14a23 System.IO.Pipes.PipeStream.ReadCore(Byte[], Int32, Int32)
000000000c83e610 000007fef0169d8f System.IO.BinaryReader.FillBuffer(Int32)
000000000c83e650 000007fef0169c8a System.IO.BinaryReader.ReadInt32()
我还查看了阻塞的AnonymousPipeServerStream对象,以及它的状态和句柄。
它有:
这是主方句柄的!句柄输出。
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。
任何可能出错的想法?当我关闭管道时,为什么读取手柄的主控端没有关闭?为什么管道没有损坏,尽管客户端已经终止,尽管事实上我调用了DisposeLocalCopyOfClientHandle?
我能做些什么来至少解决这个问题?也许只是在阅读线程上做Thread.Interrupt?..
答案 0 :(得分:2)
主进程中可能的事件序列,前面是线程号:
修正:
在线程2中终止从属进程,但不要关闭句柄。这将导致线程1中的任何读取终止,然后关闭线程1中的管道句柄。
道德:
在您使用它们时不要关闭手柄。