Tag: 重叠 io

命名管道 – 异步偷看

当在异步模式下打开的System.IO.Pipe.NamedPipeServerStream有更多可用于读取的数据时,我需要找到一种通知方式 – WaitHandle将是理想的。 我不能简单地使用BeginRead()来获取这样的句柄,因为我可能会被另一个想要写入管道的线程发出信号 – 所以我必须释放管道上的锁并等待写入完成,和NamedPipeServerStream没有CancelAsync方法。 我也尝试调用BeginRead(),然后如果线程被发出信号,则在管道上调用win32函数CancelIO,但我不认为这是一个理想的解决方案,因为如果在数据到达和处理时调用CancelIO,它将会被删除 – 我仍然希望保留这些数据,但是在写入之后稍后处理它。 我怀疑win32函数PeekNamedPipe可能有用,但我想避免不得不用它连续轮询新数据。 在上面的文字有点不清楚的情况下,这里大致是我想要做的… NamedPipeServerStream pipe; ManualResetEvent WriteFlag; //initialise pipe lock (pipe) { //I wish this method existed WaitHandle NewDataHandle = pipe.GetDataAvailableWaithandle(); Waithandle[] BreakConditions = new Waithandle[2]; BreakConditions[0] = NewDataHandle; BreakConditions[1] = WriteFlag; int breakcode = WaitHandle.WaitAny(BreakConditions); switch (breakcode) { case 0: //do a read on the pipe […]