Multithreading 多线程服务器的C语言实现#

Multithreading 多线程服务器的C语言实现#,multithreading,service,while-loop,namedpipeserverstream,Multithreading,Service,While Loop,Namedpipeserverstream,我正在创建一个Windows服务,它有一个组件,可以监听命名管道,与从用户空间运行的程序进行交互。我使用了中的代码作为多线程服务器实现的基础,但是我从在紧密循环中调用的ProcessNextClient操作中获得了强烈的代码味道,如下所示。除了重复捕获IOException并重试之外,是否真的没有更好的方法来知道何时将另一个流的开口添加到命名管道 public void ProcessNextClient() { try {

我正在创建一个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
        }
    }

在我看来,代码将位于

pipeStream.WaitForConnection();

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

在我看来,代码将位于

pipeStream.WaitForConnection();

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

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

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


。它还显示了如何在管道或TCP上承载相同的服务。

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

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


。它还显示了如何在管道或TCP上承载相同的服务。

它将一直承载,直到达到服务器实例的限制为止。然后是一个抛接球的紧环。我想我要寻找的是一种阻止方法,直到至少一个现有任务/线程完成释放其对管道的控制。如果您在错误捕获中添加了一个线程。睡眠会怎么样?它将暂停应用程序线程以防止cpu负载过大。或者你可以对请求进行排队。睡眠至少可以防止进程占用CPU,但这种不雅仍然存在。请您详细说明一下排队请求的含义好吗?在.NET中使用try-catch并不总是一个禁忌。在某些情况下,这是不可避免的,尤其是在处理超出您控制范围的事情时,例如“文件正在使用”问题,或者当您的客户端正在对您的windows服务进行攻击时。在这些情况下,最好只使用“是否有效”阈值。通过排队,我的意思是,一旦达到限制,您可以将客户机添加到队列中,然后在开始侦听新客户机之前检查队列。这不是我在试图避免尝试捕获,而是我在试图避免。没有打开的NamedPipeServerStream,就没有要排队的客户端。有了一个,就不需要阻塞。它会一直阻塞,直到达到服务器实例的限制为止。然后是一个抛接球的紧环。我想我要寻找的是一种阻止方法,直到至少一个现有任务/线程完成释放其对管道的控制。如果您在错误捕获中添加了一个线程。睡眠会怎么样?它将暂停应用程序线程以防止cpu负载过大。或者你可以对请求进行排队。睡眠至少可以防止进程占用CPU,但这种不雅仍然存在。请您详细说明一下排队请求的含义好吗?在.NET中使用try-catch并不总是一个禁忌。在某些情况下,这是不可避免的,尤其是在处理超出您控制范围的事情时,例如“文件正在使用”问题,或者当您的客户端正在对您的windows服务进行攻击时。在这些情况下,最好只使用“是否有效”阈值。通过排队,我的意思是,一旦达到限制,您可以将客户机添加到队列中,然后在开始侦听新客户机之前检查队列。这不是我在试图避免尝试捕获,而是我在试图避免。没有打开的NamedPipeServerStream,就没有要排队的客户端。我想,我正在寻找的是:一种跟踪线程/任务数量的方法,这些线程/任务仍然处于活动状态,因此具有开放管道;或者是一种在资源可用之前阻止新名称的PipeServerStream的方法,而无需创建自旋锁。我想,我要寻找的是:一种跟踪仍处于活动状态且因此具有开放管道的线程/任务数量的方法;或者在资源可用之前阻止新名称的PipeServerStream,而不创建spinlock。非常好的建议。在一个简单的样品或一个链接,我会标记为接受你。很好的建议。在一个简单的样品或一个链接,我会标记为接受你。