2016-03-04 98 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浪费任何东西。