我做了一个TCP多线程通信程序
  各地的客户端将数据发送到我这里的服务器
  现在大概有20多个客户端。 一个客户端连接到服务器。服务器就分配一个新的线程专门处理它的数据这个程序运行  一天 CPU使用率就高到70%多了     我不知道我可能在这个程序中犯什么错误 会导致这样的结果?  

解决方案 »

  1.   

    线程可以确认  不使用了就会断开  .NET对线程的机制是使用完了会自动销毁。 为了让线程一直监听客户端的数据我写了一个wile 死循环  用  sock.Receive(byte[] dates); 监听    捕获到异常后解开这个死循环
    bool Receive_Month=true;
    while (Receive_Month)
    {
      try
      {
        sock.Receive.....
      }catch (SocketException e)
       {
           if (SocketError.ConnectionReset == e.SocketErrorCode)
           {
           Receive_Month=false;
           .....
            }
        }
      }
    }
      

  2.   

    多线程 以榨取cup为目的。
    所以记着每次释放
      

  3.   

    这样做的话,明显有很多问题。一般都建议用异步处理方式吧。 20多个线程,每个都在while(true) 不慢才怪呢。还有类似这种长连接做法一般都会做心跳包协议,客户端长时间不发心跳包就应该释放该连接相关资源。
      

  4.   

    楼主以后在线程里用死循环时,记得在第一句话先Sleep个几毫秒或者几十毫秒,不然CPU就一直浪费在这里了,如果你Sleep了,它调度的时候就有一定的空闲了。
    建议所有的死循环在第一句话都Sleep。另外,在客户端连接上来以后,先Sleep个几毫秒,我一般Sleep 10毫秒。这是一个好习惯,但是具体为什么这么做我没有去深究。希望对楼主有用。
    bool Receive_Month=true; 
    while (Receive_Month) 

    Thread.Sleep(20);
      try 
      { 
        sock.Receive..... 
      }
      catch (SocketException e) 
      { 
        if (SocketError.ConnectionReset == e.SocketErrorCode) 
          { 
            Receive_Month=false; 
            ..... 
          } 
       } 
      } 
    }
      

  5.   

    我一般是 sleep(100),反正1/10秒 你也感觉不出了