Вы можете написать многопоточный конвейерный сервер, многократно создав NamedPipeServerStream и ожидая одного соединения, а затем порождая поток для этого экземпляра NamedPipeServerStream.
Вы можете иметь только 254 одновременно работающих клиента, хотя в соответствии с документацией .NET MSDN, связанной ниже. Для Win32 API, вы можете передать специальное значение, чтобы получить неограниченное количество на основе системных ресурсов. Кажется, документация MSDN неверна, как указано ниже.
Приведенный ниже код не тестируется, поэтому, пожалуйста, не копируйте и не вставляйте его для производственного использования без тестирования:
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
}
}