Multiproceso NamePipeServer en C #

Hola
Quiero usar NamedPipeServerStream, que es nuevo de .NET 3.5 para la comunicación namedpipe. Quiero escribir un servidor de tuberías multiproceso. es manejado por defecto o debería escribir código para eso. mi servidor de pipa debe manejar solicitudes múltiples a la vez

alguna solución o código?

Cada instancia de NamedPipeServerStream es una implementación de Stream que envuelve un identificador a una instancia de un canalización con nombre. Puede (y un servidor de pipa multiproceso) tener varias instancias de NamedPipeServerStream para la misma pipa nombrada: cada una envuelve una manija a una instancia diferente de la pipa nombrada, dando servicio a un cliente diferente. Las instancias de canalización nominales (incluso para el mismo conducto) se mantienen separadas por el sistema operativo, por lo que no hay necesidad de ninguna encoding explícita para mantener separada la comunicación de cada cliente con el servidor.

Lo que necesita para codificar explícitamente es el modelo de subprocesamiento para el servidor. El enfoque más simple para el subprocesamiento múltiple del servidor se explica en esta respuesta SO , que incluye una plantilla de pseudo-código. Las implementaciones más escalables, si es necesario admitir un gran número de llamadas simultáneas, utilizarían la agrupación de subprocesos y los métodos asíncronos en lugar de crear una secuencia dedicada para cada conexión.

Puede escribir un servidor de tuberías de múltiples hilos creando repetidamente un NamedPipeServerStream y esperando una conexión, y luego generando un hilo para esa instancia de NamedPipeServerStream.

Solo puede tener 254 clientes simultáneos según la documentación de .NET MSDN vinculada a continuación. Para las API de Win32, aunque puede pasar un valor especial para obtener un número ilimitado en función de los recursos del sistema. Parece que la documentación de MSDN es incorrecta, como se indica a continuación.

El siguiente código no se prueba, así que no copie y pegue para usar en producción sin probarlo:

public class PipeServer { bool running; Thread runningThread; EventWaitHandle terminateHandle = new EventWaitHandle(false, EventResetMode.AutoReset); public string PipeName { get; set; } void ServerLoop() { while (running) { ProcessNextClient(); } terminateHandle.Set(); } public void Run() { running = true; runningThread = new Thread(ServerLoop); runningThread.Start(); } public void Stop() { running = false; terminateHandle.WaitOne(); } public virtual string ProcessRequest(string message) { return ""; } public void ProcessClientThread(object o) { NamedPipeServerStream pipeStream = (NamedPipeServerStream)o; //TODO FOR YOU: Write code for handling pipe client here pipeStream.Close(); pipeStream.Dispose(); } public void ProcessNextClient() { try { NamedPipeServerStream pipeStream = new NamedPipeServerStream(PipeName, PipeDirection.InOut, 254); pipeStream.WaitForConnection(); //Spawn a new thread for each request and continue waiting Thread t = new Thread(ProcessClientThread); t.Start(pipeStream); } catch (Exception e) {//If there are no more avail connections (254 is in use already) then just keep looping until one is avail } } 

NamedPipeServerStream es una conexión punto a punto. Debe sincronizar las llamadas usted mismo, por ejemplo, las llamadas escritas en una cola y su servidor lee desde la cola sincronizada y realiza las llamadas.