Tubos con nombre - Ojeada asíncrona

Necesito encontrar una manera de recibir notificaciones cuando un System.IO.Pipe.NamedPipeServerStream abierto en modo asíncrono tenga más datos disponibles para leer en él; un WaitHandle sería ideal. No puedo simplemente usar BeginRead () para obtener un identificador de este tipo porque es posible que otro hilo que quiere escribir en la tubería me señale, así que tengo que liberar el bloqueo de la tubería y esperar a que se complete la escritura. y NamedPipeServerStream no tiene un método CancelAsync. También intenté llamar a BeginRead (), y luego llamar a la función winIO CancelIO en la tubería 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 llegan y se procesan, ser descartado - todavía deseo conservar esta información, pero procesarla más tarde, 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.

En el caso de que el texto de arriba no esté claro, aquí hay algo que me gustaría poder 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;
     }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta