Мне нужно найти способ получать уведомления, когда 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
break;
case 1:
//break so that we release the lock on the pipe
break;
}
}