我有一个主人和一个奴隶计划谁通过一对匿名pipe道进行交互。
交互看起来像这样:
Master创build两个AnonymousPipeServerStream
Master开始客户端进程,给他们.GetClientHandleAsstring()
主.disposeLocalcopyOfClientHandle的两个pipe道
偶尔主人强制终止从另一个线程(Process.Kill())的奴隶,也closures这两个pipe道对象。
在非常罕见的情况下,从属终止时, 从主pipe侧的pipe道读取无限期地 (或者有时是明确的)(例如几分钟)。 我无法在本地机器上重现它,但是它经常在大型群集上发生。
我抓住了这种情况的转储,这就是我所看到的:
将Winforms中的标签调整为左侧
应该在UWP应用程序中使用哪个命名空间类HttpClient?
Linq to sql – 如何对查询结果进行sorting
在.Net中testingWindows服务
堆栈跟踪阻塞的主(我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,IntPtr)*** WARNING: Unable to verify checksum for System.Core.ni.dll 000000000c83e540 000007feeac14574 System.IO.Pipes.Pipestream.ReadFileNative(Microsoft.Win32.SafeHandles.SafePipeHandle,Byte[],System.Threading.NativeOverlapped*,Int32 ByRef) 000000000c83e5a0 000007feeac14a23 System.IO.Pipes.Pipestream.ReadCore(Byte[],Int32) 000000000c83e610 000007fef0169d8f System.IO.BinaryReader.FillBuffer(Int32) 000000000c83e650 000007fef0169c8a System.IO.BinaryReader.ReadInt32()
我还查看了阻塞的AnonymousPipeServerStream对象,以及状态和句柄。
它有:
m_state = 4(即closures)
m_clientHandle是一个closures句柄(根据SafeHandle._state和!句柄的输出)
m_handle是一个打开的句柄,_state = 6(即不closures,即使Pipe对象closures,根据反编译,它应该调用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 @R_876_4045@ion available
我有点担心HandleCount是2,PointerCount是5。
任何想法可能会出错? 为什么当我closurespipe道时,读取手柄的主控端没有closures? 尽pipe客户端终止,尽pipe事实上我称之为disposeLocalcopyOfClientHandle,为什么pipe道不会中断?
我能做些什么来至less解决这个问题? 也许只是在阅读线程上执行Thread.Interrupt?
使用System.Security.Cryptography将Win32 Crypto API调用转换为C#
没有find反序列化types为T的对象的构造函数
向GAC注册/安装大会的“正确”方式是什么?
是否有API调用来开始扫描硬件设备
涉及消失项目的奇怪问题
主进程中可能的事件序列,前面是线程号:
1 – 关于调用Microsoft.Win32.UnsafeNativeMethods.ReadFile(在BinaryReader.ReadInt32中)
2 – 杀死奴隶进程,并关闭管道手柄
3 – win32管道句柄(现在关闭)被重新用于其他管道(或文件或其他)
1 – Microsoft.Win32.UnsafeNativeMethods.ReadFile开始阅读使用旧的句柄,现在引用一些其他对象和块。
固定:
杀死线程2中的从属进程,但不要关闭句柄。 这将导致线程1中的任何读取结束,然后关闭线程1中的管道句柄。
道德:
当你还在使用它们时,不要关闭手柄。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。