读书人

写socket通信的线程的有关问题

发布时间: 2013-04-21 21:18:07 作者: rapoo

写socket通信的线程的问题
初学者,试写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

[解决办法]
对,线程就是从上到下执行一次,这中间如果有循环它会把循环走完,如果没循环,这线程走完后就会自动释放线程的资源。

引用:
引用:有一个 睡眠函数 ,Sleep() 你放到 循环里面 ,

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

你的意思是说线程调用的那个方法走完了就会自动结束线程,……

读书人网 >C#

热点推荐