读书人

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

发布时间: 2014-01-17 00:06:00 作者: rapoo

关于非托管代码释放的疑问
小弟做了个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
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

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

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


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

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

Quote: 引用:

Quote: 引用:

Quote: 引用:

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

[解决办法]
这么写不对呀,你看呀,i=0的时候,ss已经new了一个对象,他指向一个对象,可是i=1的时候,又new了一个,应该指向另外一个变量,如果指向同一个变量,实际传递给这个变量新的地址,旧的对象的地址被丢弃,导致旧的没办法delete,造成内存泄露

读书人网 >VB Dotnet

热点推荐