No encuentro un buen ejemplo de cómo crear un receptor de canalizaciones con nombre reutilizable que se ejecute de forma asíncrona. Puedo hacer un oyente reutilizable:¿Cómo se implementa un oyente de tuberías con nombre reutilizable que se ejecuta de forma asíncrona?
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
while (true)
{
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
pipeServer.Disconnect();
}
y puedo hacer un oyente asíncrono:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
}, null);
Pero me parece que no puede obtener tanto ir. ¿Hay un buen ejemplo para esto? También me preocupan los mensajes parcialmente enviados, ya que creo que es un problema con las comunicaciones asíncronas como esta.
Actualización: Estoy un poco más cerca.
pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
while (running)
{
String text = reader.ReadLine();
if (String.IsNullOrEmpty(text) == false)
{
MessageBox.Show(text);
}
}
MessageBox.Show("Done!");
}, null);
que leerá con éxito una vez, y continuará bucle, con ReadLine devolver una cadena vacía vacía después de la lectura con éxito inicial. Entonces claramente no está bloqueando, y está intentando leer de nuevo. El problema es que si envío el mismo mensaje por segunda vez, no aparece, y mi guionista dice que está recibiendo el error 2316 (aunque no entiendo lo que eso significa). Creo que solo tengo que hacer algo similar a esto, donde la tubería se limpia cada vez, como la primera muestra de código que enumeré, pero todavía no he conseguido que funcione.
Los códigos de error del sistema (es decir, Win32 API) están aquí: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx Pero no hay ningún error 2316 ... ¿estás seguro? ese era el código de error? ¿Podría incluir todos los detalles de la excepción (incluido el tipo y el mensaje? – Richard
Lo siento, no lo vi hasta ahora y ya no estoy produciendo el error. Este es el código que lo produjo, al final del escritor: si (== tubería INVALID_HANDLE_VALUE) \t \t { \t \t \t tribunal << "error:" << GetLastError();} \t \t –
resulta que era el error 231. El 6 fue la salida de otra cosa –