C #: compreensão de NamedPipeServerStream assíncrona
Eu estava tentando encontrar um bom e claro exemplo de NamedPipeServerStream assíncrono e não consegui encontrar nenhum adequado para mim.
Eu quero ter NamedPipe Server, que é assincronamente aceitar mensagens de clientes. O cliente é simples e está bem para mim. Mas não consigo encontrar exemplos de servidor ou não consigo entender como ele funciona.
Agora, eu entendo que preciso criar o objeto NamedPipeServerStream. Vamos fazer isso:
namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);
Parece funcionar.Mas eu não sei, eu tenho que usar PipeSecurity ou PipeAccessRule? Eu faço? Meu servidor funcionará como um serviço do Windows em um sistema local.
Qual o proximo? Eu estou pensando que preciso usar BeginWaitForConnection para conexões assíncronas. Vamos ver:
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
Questão 1: O que é isso "alguma coisa estranha"? Como usá-lo?
Questão 2: Eu deveria fazer
while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}
Para fazer meu servidor sempre esperar por conexões? Ou eu preciso fazer isso de alguma forma mais?
E então ... Vamos dar uma olhada na função 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);
}
..Isso não funciona, é claro. PorqueEu não sei exatamente como receber string do stream. Como? Agora ele gera um InvalidOperationException:
O tubo ainda não foi conectado.
Então, como organizar o trabalho assíncrono com NamedPipeServerStream?