1

我正在创建一个 Windows 服务,该服务具有一个组件,该组件侦听命名管道以与从用户空间运行的程序进行交互。我已将此答案中的代码用作多线程服务器实现的基础,但是我从在紧密循环中调用的 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
        }
    }
4

2 回答 2

1

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

如果您需要通过将绑定从管道更改为 TCP/http 绑定,将应用程序转移到多个节点上,那么实施 WCF 的痛苦也将使您能够扩展一台机器。

此处是 WCF 服务的示例实现。它还展示了如何在管道或 TCP 上托管相同的服务。

于 2013-10-17T02:17:27.087 回答
0

在我看来,代码将位于

pipeStream.WaitForConnection();

直到检测到客户端,然后继续。我不认为它会像你描述的那样循环它,除非它被客户锤击。你总是可以添加一个断点来检查。

于 2013-03-26T20:08:18.283 回答