C#中的多线程服务器实现

时间:2013-03-26 20:01:18

标签: multithreading service while-loop namedpipeserverstream

我正在创建一个Windows服务,它有一个组件可以侦听命名管道,以便与从用户空间运行的程序进行交互。我已经使用this answer中的代码作为多线程服务器实现的基础,但是我从紧密循环中调用的ProcessNextClient操作中获得强大的代码味道,如下所示。真的没有更好的方法可以知道何时将另一个流的开头添加到命名管道而不是重复捕获IOException并再试一次?

    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
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以按照WCF处理管道吗?您将受益于使用IO完成端口的中断驱动系统,以便在应用程序中建立新连接时通知您的应用程序代码。

如果您需要通过将管道绑定更改为TCP / http绑定而需要将应用程序放在多个节点上,那么实现WCF的痛苦也可以使您能够扩展一台计算机。

An example implementation of a WCF service is here。它还显示了如何在管道或TCP上托管相同的服务。

答案 1 :(得分:0)

在我看来,代码将位于

pipeStream.WaitForConnection();

直到检测到客户端然后继续。我不认为它像你描述的那样循环它,除非它被客户锤击。您可以随时添加断点进行检查。