【求助】关于PeekNamedPipe调用防止Process的StandardOutput管道read阻塞获取读写句柄的问题

花裕新 2019-01-18 01:54:40
在执行p.StandardOutput.ReadLine()的时候 经常会遇到程序不继续跑了
查了查说是因为StandardOutput管道里面没数据了,会一直等到有数据的时候才继续执行。而本身提供的peek又要在read一次以后才能正确返回管道是否还有数据。只有PeekNamedPipe才能正确的无阻塞的检测到管道的数据 下面是我写的

[DllImport("kernel32.dll")]
static extern bool PeekNamedPipe(IntPtr hNamedPipe, IntPtr lpBuffer,
uint nBufferSize, IntPtr lpBytesRead, IntPtr lpTotalBytesAvail,
IntPtr lpBytesLeftThisMessage);

if (PeekNamedPipe(Process.GetCurrentProcess().MainWindowHandle, System.IntPtr.Zero, 0, System.IntPtr.Zero, count, System.IntPtr.Zero))
{
Console.WriteLine(count);
result.OutputString += p.StandardOutput.ReadLine();

}
else
{
Console.WriteLine("没有获取到");
result.OutputString += "流读取超时";
quittime.Reset();
return result;

}

不管管道中是否还有数据都会返回false,是不是我PeekNamedPipe后面给的参数错了呢,是否给的句柄给错了?应该给管道的读写句柄?而我给的是控制台的句柄 所以造成判断无数据吗?后面几个参数也理解不太上去。。小弟也卡住了。。。



...全文
1519 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
花裕新 2019-01-18
  • 打赏
  • 举报
回复
 p.OutputDataReceived += new DataReceivedEventHandler(delegate (object sender, DataReceivedEventArgs e)
{
//Console.WriteLine("OutputDataReceived委托");
if(string.IsNullOrEmpty(e.Data))
{
Console.WriteLine(id+"+++++++++++++++++++++++++++++");
}
else
{
Console.WriteLine(id + "-------------------------------");
rs += e.Data;
}

});


rs += e.Data; 仍然会阻塞 我的天


回来继续研究这个API


[DllImport("kernel32.dll")]
static extern bool PeekNamedPipe(IntPtr hNamedPipe, IntPtr lpBuffer,
uint nBufferSize, IntPtr lpBytesRead, IntPtr lpTotalBytesAvail,
IntPtr lpBytesLeftThisMessage);

System.IO.FileStream f =(System.IO.FileStream) p.StandardOutput.BaseStream;

PeekNamedPipe(f.Handle, System.IntPtr.Zero, 0, System.IntPtr.Zero, count, System.IntPtr.Zero)





还是一直返回false。。。
花裕新 2019-01-18
  • 打赏
  • 举报
回复
是我没表述明白吗?

那么我问一下怎么可以获取到 p.StandardOutput的读写句柄呢?
花裕新 2019-01-18
  • 打赏
  • 举报
回复
ReadToEnd()也会引起阻塞,

但是p.WaitForExit(); 我又必须要用 所以只能通过PeekNamedPipe来做预判断

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧