Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AnonymousPipeServerStream.Read()偶尔挂起在客户端出口_C#_.net_Windows_Debugging_Pipe - Fatal编程技术网

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())强制终止从线程,并关闭两个管道对象
在非常罕见的情况下,在从机端接时,从主机侧块上的管道读取数据是无限期的,有时是肯定的(例如几分钟)。我无法在本地机器上复制它,但它会在大型集群上不时发生

我捕捉到了这种情况,下面是我看到的:

被阻止主机的Stacktrace(我100%确信此时客户端进程已经终止):

我还研究了阻塞的匿名PipeServerStream对象及其状态和句柄

它有:

  • 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开始使用现在引用其他对象的旧句柄和块进行读取
修正:

杀死线程2中的从属进程,但不要关闭句柄。这将导致任何读入线程1终止,然后关闭线程1中的管道句柄

道德:


不要在仍在使用句柄时关闭它们。

如何启动子进程?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