C #: zrozumienie asynchronicznego NamedPipeServerStream

Próbowałem znaleźć dobry i jasny przykład asynchronicznego NamedPipeServerStream i nie mogłem znaleźć żadnego odpowiedniego dla mnie.

Chcę mieć serwer NamedPipe, który asynchronicznie akceptuje wiadomości od klientów. Klient jest prosty i dla mnie w porządku. Ale nie mogę znaleźć przykładów serwera lub nie mogę zrozumieć, jak to działa.

Teraz, jak rozumiem, muszę utworzyć obiekt NamedPipeServerStream. Zróbmy to:

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);

Wydaje się działać.Ale nie wiem, czy w ogóle muszę używać PipeSecurity lub PipeAccessRule? Czy ja? Mój serwer będzie działał jako usługa systemu Windows w systemie lokalnym.

Co następne? Myślę, że muszę użyć BeginWaitForConnection dla asynchronicznych połączeń. Zobaczmy:

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);

Pytanie 1: Co to za „dziwna rzecz”? Jak tego użyć?

pytanie 2: Czy powinnam

while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}

Aby mój serwer zawsze czekał na połączenia? Czy muszę to zrobić jakoś inaczej?

A potem ... Przyjrzyjmy się funkcji WaitForConnectionAsyncCallback:

private void WaitForConnectionAsyncCallback(IAsyncResult result)
        {
            Console.WriteLine("Client connected.");
            byte[] buff = new byte[BUFFERSIZE];
            namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize);
            string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize);
            Console.WriteLine("   " + recStr);
            namedPipeServerStream.EndWaitForConnection(result);
        }

.. To oczywiście nie działa. BoNie wiem, jak dokładnie odebrać ciąg ze strumienia. W jaki sposób? Teraz podnosi wyjątek InvalidOperationException:

Rura nie została jeszcze podłączona.

Jak więc zorganizować asynchroniczną pracę z NamedPipeServerStream?

questionAnswers(1)

yourAnswerToTheQuestion