初学者,试写socket服务器,涉及到线程这块估计处理的不是很好,导致只要两三个用户连接的话cpu就占用百分之七八十了,不知道哪里出错了,求指导,只有20分了谢谢想法就是开个监听的线程,来一个连接就开个线程去处理,//监听线程
        private void StartListen()
        {
            listener = new TcpListener(ipep);
            listener.Start();
            while (true)
            {
                Socket clientSocket = listener.AcceptSocket();
                Thread clientThread = new Thread(new ParameterizedThreadStart(SocketWork));
                CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
                clientThread.IsBackground = true;
                clientThread.Start(clientSocket);
            }
        }//处理每个用户的线程
并把连接的socket的名字信息和线程信息保存在一个arraylist中
        private void SocketWork(object objSocket)
        {
            Socket socket = (Socket)objSocket;

            //
//省略中间收发的代码
//

Client cl = new Client(clientName, socket.RemoteEndPoint, socket, Thread.CurrentThread);
            clientList.Add(cl);


        }当用户离线时需要关闭该用户的线程
但我调试的时候发现,每次有客户端离线,线程好像关闭不掉,不知道我这种关闭的方法是否正确
        private void Gone(string str, Socket socket)
        {
            string[] token = str.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            string name = token[1];
            Client cl=null;
            foreach (object obj in clientList)
            {
                Client c = (Client)obj;
                if (c.Name != name)
                {
                    SendMsgToClient.Send(c, str);//发送到其他客户端告知有人离线
                }
                else
                {
                    cl = c;
                }
            }
            if (cl.CL_Thread.ThreadState == ThreadState.Running)
            {
                cl.CL_Thread.Abort();
            }
            clientList.Remove(cl);
            DeleItem(name);
        }
参考了这篇文章
http://blog.csdn.net/liguo9860/article/details/6148614

解决方案 »

  1.   

    StartListen是主进程的吗,里面有while true,这个把cpu占满了
      

  2.   

    这个不是主线程,一开始就开的一个监听的线程
    listenThread = new Thread(new ThreadStart(StartListen));
      

  3.   

    其中有一个疑问就是在方法里怎么将调用该方法的线程保存起来,用currentthread可以?
      

  4.   


    listener.AcceptSocket 会阻塞主线程。1. arraylist  clientList是否有多线程处理机制?
    2.如果有很多连接,不要针对每个请求开一个线程,可以用一个线程来循环处理。
    3.对clientList里的sockets也可以统一用一个线程来处理释放。
      

  5.   

    有一个 睡眠函数 ,Sleep() 你放到 循环里面 ,对于线程的关闭,不建议手动关闭,如果可能的话让线程自动走完,那样程序会自动释放一些资源, 比如 while (true) 这里 定义一个 bool变量来控制它循环,关闭线程得时候flase,线程走完自动就关闭了。