Necesito encontrar una forma de recibir notificaciones cuando un System.IO.Pipe.NamedPipeServerStream abierto en modo asíncrono tiene más datos disponibles para leer en él, un WaitHandle sería ideal. No puedo usar BeginRead() para obtener un identificador de este tipo porque es posible que alguien me señale otro hilo que quiera escribir en el conducto, así que tengo que soltar el bloqueo en el tubo y esperar a que la escritura esté completa. y NamedPipeServerStream no tiene un método CancelAsync. También traté de llamar a BeginRead(), y luego llamar a la función de win32 CancelIO en el conducto si el hilo se señaliza, pero no creo que esta sea una solución ideal porque si se llama a CancelIO justo cuando los datos están llegando y se están procesando, ser descartado, aún deseo conservar estos datos, pero procesarlos en un momento posterior, después de la escritura. Sospecho que la función win32 PeekNamedPipe podría ser útil, pero me gustaría evitar tener que buscar continuamente nuevos datos con ella.Canalizaciones con nombre: asimetría
En el caso likley que el texto anterior es un poco claro, aquí es más o menos lo que me gustaría ser capaz de hacer ...
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: el uso de lecturas de 0 bytes con E/S superpuestas como una forma de recibir una señal cuando se escriben datos sin leer realmente ningún dato es muy útil y no se evidencia en la documentación. –