2016-03-04 92 views
1

我寫了簡單的多線程TCP C#服務器程序。運行我的程序後,我得到高CPU使用率和線程數在任務管理器中不斷增加。任何人都可以幫我弄清楚如何解決並提出建議嗎?多線程TCP服務器與高CPU和保持增加線程數

這是我的代碼。

public class Program 
{ 
    static void Main(string[] args) 
    { 
     int _Port = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["TCPPort"]); 
     string _IP = System.Configuration.ConfigurationManager.AppSettings["TCPIP"]; 
     TcpServer server = new TcpServer(_Port); 
    } 
} 

public class TcpServer 
{ 
    private TcpListener _server; 
    private Boolean _isRunning; 
    private static int defaultMax = 8; 
    public TcpServer(int port) 
    { 
     _server = new TcpListener(IPAddress.Any, port); 
     _server.Start(); 
     _isRunning = true;   
     LoopClients(); 
    } 

    public void LoopClients() 
    { 
     while (_isRunning) 
     { 

      TcpClient newClient = _server.AcceptTcpClient(); 
      SentFirstTimeData_New(newClient); 
      Thread t = new Thread(new ParameterizedThreadStart(HandleClient)); 
      t.Start(newClient); 
     } 
    } 

    public void HandleClient(object obj) 
    { 
     int requestCount = 0; 
     byte[] bytesFrom = new byte[209666]; 
     string dataFromClient = null; 
     Byte[] sendBytes = null; 
     requestCount = 0; 
     int byteread = 0; 
     string respdata = string.Empty; 
     byte[] buffer = new byte[4096]; 
     int numberOfBytesRead; 

     TcpClient client = (TcpClient)obj;   
     NetworkStream networkStream = client.GetStream(); 
     IPAddress address = ((IPEndPoint)client.Client.RemoteEndPoint).Address; 

     Boolean bClientConnected = true; 
     int id = Thread.CurrentThread.ManagedThreadId; 
     while (bClientConnected) 
     { 
      try { 
       if (networkStream.DataAvailable) 
       { 
        byteread = networkStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize); 
        dataFromClient = Encoding.ASCII.GetString(bytesFrom).TrimEnd('\0'); 
        System.Text.Encoding.ASCII.GetString(bytesFrom); 

        XmlDocument doc = new XmlDocument(); 
        string xml = Encoding.UTF8.GetString(bytesFrom).TrimEnd('\0'); 
        doc.LoadXml(xml); 
        XElement incc = XElement.Load(new XmlNodeReader(doc)); 
        respdata = AysncTCPIncomeString(incc); 

        sendBytes = Encoding.ASCII.GetBytes(respdata); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Helper.WriteLog("Exception=" + ex.Message); 
      } 
     } 
    } 

    public void SentFirstTimeData_New(TcpClient tc) 
    { 
     try 
     { 
      int threadid = Thread.CurrentThread.ManagedThreadId; 
      string Msg = HLStatusResponse.FirstTimeStatusSuccessfulResponse("STATUS", "1"); 
      NetworkStream _NetworkStream = tc.GetStream(); 
      if (_NetworkStream != null) 
      { 
       byte[] data = Encoding.ASCII.GetBytes(Msg); 
       _NetworkStream.Write(data, 0, data.Length); 

       Helper.WriteLog("ThreadId=" + threadid.ToString() + ";SentFirstTimeData :\t " + Msg); 
      } 
     } 
     catch (Exception ex) 
     { 
      Helper.WriteLog("Sent Though Tcp Eror :" + ex.ToString()); 
     } 
    } 
} 
+0

你試過調試過嗎? – antiduh

+0

嗨antiduh,是的我試圖調試它,甚至我的客戶端程序關閉,任務管理服務器線程數不會重置。 – Jasper

回答

0

考慮這個塊的代碼:

Boolean bClientConnected = true; 
    int id = Thread.CurrentThread.ManagedThreadId; 
    while (bClientConnected) 
    { 
     try { 
      if (networkStream.DataAvailable) 

你永遠不會改變bClientConnected - 它始終是真實的,所以你的循環永遠不會退出。另外,如果連接空閒 - 也就是說,如果networkStream.DataAvailable爲false - 那麼你只需在你的while循環中旋轉什麼也不做。

如果每個客戶端都有一個線程,爲什麼不通過執行從套接字讀取來阻塞該線程呢?然後線程不會浪費CPU浪費任何東西。