首页 新闻 会员 周边 捐助

C# 用来接收消息的Socket在结束后,接收消息的线程是否会停止并被回收

0
悬赏园豆:10 [已解决问题] 解决于 2020-07-23 09:52
                //开启新线程,接收客户端发来的信息
                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);会执行失败,然后线程抛异常,被回收。我想测试下,但是不知道怎么测这个线程已经结束了。

echo_lovely的主页 echo_lovely | 小虾三级 | 园豆:1546
提问于:2020-07-22 10:43
< >
分享
最佳答案
0

结束了,while结束线程就结束了。
测试看楼上。
socketSend.Receive这个方法,网络异常的时候会抛异常的,异常之后可以处理/清理下相关资源。

收获园豆:5
日暮青色 | 菜鸟二级 |园豆:495 | 2020-07-22 23:33

卧槽,我没脑子了,我把资源释放写finally里了。我老觉得哪里不对劲

echo_lovely | 园豆:1546 (小虾三级) | 2020-07-23 10:07

Socket是不是调用Close()方法就会自己释放掉?

echo_lovely | 园豆:1546 (小虾三级) | 2020-07-23 10:09
其他回答(2)
0

Thread.CurrentThread.ManagedThreadId
这个可以获取当前线程Id,但是不好判断线程有没有被回收,
因为都是由线程池控制的,即使线程ID不一样也不能判断他就被回收了
因为有可能是其他的闲置线程过来处理,上一个线程处理其他的逻辑去了

收获园豆:5
不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-07-22 10:48
0

会结束,在vs2012控制台中,Receive方法会抛出异常,紧接着有打印 线程0x什么已退出

echo_lovely | 园豆:1546 (小虾三级) | 2020-07-23 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册