当前位置:编程学习 > C#/ASP.NET >>

关于非托管代码释放的疑问

小弟做了个TCPIP服务器程序,由于对于.net的一些基本概念不是很了解,所以想问问关于非托管代码释放的问题

我个人觉得有close方法的是基本都是非托管对象,必须先close再nothing才能真正的释放

clientSocket = serverSocket.AcceptTcpClient()这句话应该是相当于New了一个对象实例,那么如果循环等待连接的话,就是循环New,这么下去是要内存出错的吧,所以我想应该释放
如果在等待连接线程里clientsocket.close,那么等待数据线程里Dim networkStream As NetworkStream = clientSocket1.GetStream()就会报错

那要怎么释放第一个线程里的对象呢??

下面是服务器代码:
我用一个线程等待客户端连接进来
 Private Sub WaitLink()

        Dim clientSocket As TcpClient
        Try
            Do While True
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try

    End Sub


下面是等待数据子线程代码


    Private Sub WaitData(ByVal inClientSocket As TcpClient)
        dim clientSocket1 as TcpClient
        clientSocket1 = inClientSocket
        '循环标志位
        Dim infiniteCounter As Integer
        Dim requestCount As Integer
        Dim bytesFrom(10024) As Byte

        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            Try
                requestCount = requestCount + 1
                Dim networkStream As NetworkStream = clientSocket1.GetStream()
                networkStream.Read(bytesFrom,0,CInt(clientSocket1.ReceiveBufferSize))

            End Try
        Next

    End Sub


.net 非托管代码 内存释放 TCPIP --------------------编程问答-------------------- clientsocket要在接收数据子线程使用,
所以也应由接收数据子线程在通信结束时释放。 --------------------编程问答-------------------- clientsocket 应该是在 Private Sub WaitData(ByVal inClientSocket As TcpClient) 方法里面释放
你在主线程释放了这时候肯定出错了啦  --------------------编程问答--------------------
引用 1 楼 rtdb 的回复:
clientsocket要在接收数据子线程使用,
所以也应由接收数据子线程在通信结束时释放。


我现在的代码clientsocket是个过程变量。。。。我把他传到clientsocket1,那我再接收数据子线程里clientsocket1.close是不是另一个线程里的clientsocket相关资源也能得到释放 --------------------编程问答--------------------
引用 2 楼 laiyongxin 的回复:
clientsocket 应该是在 Private Sub WaitData(ByVal inClientSocket As TcpClient) 方法里面释放
你在主线程释放了这时候肯定出错了啦 


我现在的代码clientsocket是个过程变量。。。。我把他传到clientsocket1,那我再接收数据子线程里clientsocket1.close是不是另一个线程里的clientsocket相关资源也能得到释放  --------------------编程问答-------------------- 1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗 --------------------编程问答--------------------
引用 5 楼 bigbillybear 的回复:
1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭 --------------------编程问答--------------------
引用 6 楼 laiyongxin 的回复:
Quote: 引用 5 楼 bigbillybear 的回复:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket --------------------编程问答--------------------
引用 6 楼 laiyongxin 的回复:
Quote: 引用 5 楼 bigbillybear 的回复:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


我的意思,因为要循环等待客户端连接。。。。那我怎么能用全局变量这句话啊clientSocket = serverSocket.AcceptTcpClient() --------------------编程问答--------------------
引用 7 楼 bigbillybear 的回复:
Quote: 引用 6 楼 laiyongxin 的回复:

Quote: 引用 5 楼 bigbillybear 的回复:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket

我看了下你的代码,你的思路是:先创建一个clientsocket,然后等待用户连接
其实你可以倒过来想:有客户连接时再创建clientsocket,这样就行了 之前做socket通信是这么做的 --------------------编程问答--------------------
引用 9 楼 laiyongxin 的回复:
Quote: 引用 7 楼 bigbillybear 的回复:

Quote: 引用 6 楼 laiyongxin 的回复:

Quote: 引用 5 楼 bigbillybear 的回复:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket

我看了下你的代码,你的思路是:先创建一个clientsocket,然后等待用户连接
其实你可以倒过来想:有客户连接时再创建clientsocket,这样就行了 之前做socket通信是这么做的


没有clientSocket = serverSocket.AcceptTcpClient()我怎么知道有客户连接呢??这句话才是等待客户连接的阻塞语句啊,有客户连接,这句话才往下走啊~~~~求解~~~ --------------------编程问答--------------------
引用 10 楼 bigbillybear 的回复:
Quote: 引用 9 楼 laiyongxin 的回复:

Quote: 引用 7 楼 bigbillybear 的回复:

Quote: 引用 6 楼 laiyongxin 的回复:

Quote: 引用 5 楼 bigbillybear 的回复:

1、2楼说的我明白,我可以搞一个全局变量clientsocket,这样子线程就能去在读完数据后去关闭他,但是我做的是1对多服务器,一个线程关闭clientsocket,会导致其他线程出错吧,请问有什么合理的设计思路吗

按你说的情况是会出错的,你应该做成1对1的
然后用一个全局list保存所有的clientsocket,然后在每一个clientsocket用完后关闭


嗯,小弟笨了,要是做成一对一的,那么我也不知道需要多少个全局的clientsocket,这怎么声明这些clientsocket

我看了下你的代码,你的思路是:先创建一个clientsocket,然后等待用户连接
其实你可以倒过来想:有客户连接时再创建clientsocket,这样就行了 之前做socket通信是这么做的


没有clientSocket = serverSocket.AcceptTcpClient()我怎么知道有客户连接呢??这句话才是等待客户连接的阻塞语句啊,有客户连接,这句话才往下走啊~~~~求解~~~

我看错了,这样做就可以了

Private Sub WaitLink()       
        Try
            Do While True
                Dim clientSocket As TcpClient
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try
 
    End Sub
--------------------编程问答--------------------
引用 11 楼 laiyongxin 的回复:
我看错了,这样做就可以了

Private Sub WaitLink()       
        Try
            Do While True
                Dim clientSocket As TcpClient
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try
 
    End Sub


嗯,以前我也是在循环里声明的,不过我不确定这么做是不是能释放原来的资源

我以前想过这两端代码

for i=0 to 1
dim ss as new object
next

dim ss as object
for i=0 to 1
ss=new object
next


这两段代码再进入第二次循环后,第一次的ss会怎么样呢???是不是在内存资源上还是存在的??有区别吗?? --------------------编程问答-------------------- 好像在循环外和里面都没关系,在线程中关闭就ok了 --------------------编程问答--------------------
引用 13 楼 laiyongxin 的回复:
好像在循环外和里面都没关系,在线程中关闭就ok了


老兄你刚才改的代码不就是修改声明,放到循环里面了吗,我那个close可是注释掉的

Private Sub WaitLink()       
        Try
            Do While True
                Dim clientSocket As TcpClient
                clientSocket = serverSocket.AcceptTcpClient()
                '打开等待数据线程
                myWaitData = New Thread(AddressOf WaitData)
                myWaitData.IsBackground = True
                myWaitData.Start(clientSocket)
                '使用下面close会造成等待数据线程错误
                'clientsocket.close
                clientsocket=nothing
            Loop
        End Try
  
    End Sub


刚才问一个做C的同事,他说nothing只是清楚指针,在C里要用delete才能释放对象 --------------------编程问答--------------------
引用 13 楼 laiyongxin 的回复:
好像在循环外和里面都没关系,在线程中关闭就ok了


不过根据他的话我想到了,如果有两个clientsocket都指向一个流的话,那么一个close,其实另一个也无法再使用了,这也是我出错的原因,所以只要有一个close,资源就是被释放了,剩下的工作就是nothing那个指针了,或者说nothing变量本身了 --------------------编程问答-------------------- 这么写不对呀,你看呀,i=0的时候,ss已经new了一个对象,他指向一个对象,可是i=1的时候,又new了一个,应该指向另外一个变量,如果指向同一个变量,实际传递给这个变量新的地址,旧的对象的地址被丢弃,导致旧的没办法delete,造成内存泄露
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,