我需要找到一种方式,当以异步模式打开的System.IO.Pipe.NamedPipeServerStream具有更多可读取的数据时 - WaitHandle将是理想的。我不能简单地使用BeginRead()来获得这样的句柄,因为可能会由另一个想要写入管道的线程发出信号 - 所以我必须释放管道上的锁并等待写入完成,和NamedPipeServerStream没有一个CancelAsync方法。我也尝试调用BeginRead(),然后在管道上调用win32函数CancelIO,但是我不认为这是一个理想的解决方案,因为如果在数据到达并正在处理的情况下调用CancelIO,它将会被丢弃 - 我仍然希望保留这些数据,但是在写完后稍后再进行处理。我怀疑win32函数PeekNamedPipe可能是有用的,但我想避免不得不连续轮询新数据。命名管道 - 异步查看
在likley倘上述文字是有点不清楚,这里的大致我想怎么能够做到?
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
break;
case 1:
//break so that we release the lock on the pipe
break;
}
}
+1:使用带有重叠I/O的0字节读取作为接收数据时未实际读取任何数据的信号的方式非常有用,并且在文档中没有显而易见。 – 2010-09-18 23:16:43