//开启新线程,接收客户端发来的信息
Thread th = new Thread(receive);
th.IsBackground = true;
th.Start(socketSend);
//服务器接收客户端传来的消息
private void receive(object o)
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器接收客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];//2M大小
//接收到的有效字节数
int length = socketSend.Receive(buffer);
if (length == 0)
{
string ip=socketSend.RemoteEndPoint.ToString();
//这个dictionary存放的是用来和对应远程通信的socket
socketSend.Shutdown(SocketShutdown.Both);
socketSend.Disconnect(false);
socketSend.Close();
break;
}
}
}
}
是不是在执行 receive
方法里 socketSend.Close();
之后,这个线程就抛出异常,自己结束掉了,然后被回收?
我觉得在 socketSend.Close();
之后,新一轮循环中int length = socketSend.Receive(buffer);
会执行失败,然后线程抛异常,被回收。我想测试下,但是不知道怎么测这个线程已经结束了。
结束了,while结束线程就结束了。
测试看楼上。
socketSend.Receive这个方法,网络异常的时候会抛异常的,异常之后可以处理/清理下相关资源。
卧槽,我没脑子了,我把资源释放写finally里了。我老觉得哪里不对劲
Socket是不是调用Close()
方法就会自己释放掉?
Thread.CurrentThread.ManagedThreadId
这个可以获取当前线程Id,但是不好判断线程有没有被回收,
因为都是由线程池控制的,即使线程ID不一样也不能判断他就被回收了
因为有可能是其他的闲置线程过来处理,上一个线程处理其他的逻辑去了
会结束,在vs2012控制台中,Receive
方法会抛出异常,紧接着有打印 线程0x什么已退出