Nazwane potoki - asynchroniczne wgląd

Muszę znaleźć sposób, aby być powiadamianym, gdy System.IO.Pipe.NamedPipeServerStream otwarty w trybie asynchronicznym ma więcej danych do odczytu na nim - WaitHandle byłby idealny. Nie mogę po prostu użyć BeginRead () do uzyskania takiego uchwytu, ponieważ jest możliwe, że i może być zasygnalizowany przez inny wątek, który chce napisać do potoku - więc muszę zwolnić blokadę na rurze i poczekać na zakończenie zapisu, a NamedPipeServerStream nie ma metody CancelAsync. Próbowałem również wywołać BeginRead (), a następnie wywołać funkcję win32 CancelIO na potoku, jeśli wątek zostanie zasygnalizowany, ale nie sądzę, że jest to idealne rozwiązanie, ponieważ jeśli CancelIO jest wywoływane tak, jak dane przychodzą i są przetwarzane, to być odrzuconym - nadal chcę zachować te dane, ale przetwarzam je później, po napisaniu. Podejrzewam, że funkcja win32 PeekNamedPipe może być użyteczna, ale chciałbym uniknąć konieczności ciągłego sondowania w poszukiwaniu nowych danych.

W podobnym przypadku, gdy powyższy tekst jest nieco niejasny, oto mniej więcej to, co chciałbym zrobić ...

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;
     }
}

questionAnswers(2)

yourAnswerToTheQuestion