2013-03-26 93 views
1

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

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

我在找什么,我想是:一种方法来跟踪仍然活动的线程/任务的数量,从而有开放的管道;或者阻止新的NamedPipeServerStream,直到资源可用而不创建螺旋锁。 – psaxton 2013-03-27 18:54:44

回答

1

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

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

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

+0

优秀的建议。投入一个简单的样本或链接到一个,我会标记为接受。 – psaxton 2013-10-18 16:13:53

0

它看起来像我的代码将坐在

pipeStream.WaitForConnection(); 

,直到客户端检测到,然后继续。我不认为它像你所描述的那样循环,除非它正在与客户打交道。你总是可以添加一个断点来检查。

+0

直到达到服务器实例的限制。然后它是一个throw->抓紧环。我想我正在寻找的是一种方法来阻止,直到至少有一个现有的任务/线程完成对管道的释放。 – psaxton 2013-03-26 21:15:56

+0

如果将Thread.Sleep添加到错误捕获中,该怎么办?它会暂停应用程序线程以防止过多的CPU负载。或者你可以排队请求。 – jugg1es 2013-03-26 21:27:56

+0

睡眠至少可以防止CPU占用过程,但不雅感仍然存在。请问您是否可以通过排队请求来详细说明您的意思? – psaxton 2013-03-26 21:43:11