2013-03-26 40 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