【发布时间】:2017-08-23 03:26:57
【问题描述】:
我正在尝试从 NetworkStream 读取数据。我写下一段代码:
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
Dim tcpclnt1 As New TcpClient
Dim streamTcp1 As NetworkStream
Dim DataBuffer(1024) As Byte 'Buffer for reading
Dim numberOfBytes As Integer
' event for reading data from stream
Dim evtDataArrival As New AsyncCallback(AddressOf DataProcessing)
Private Sub Btn_Connect5000_Click(sender As Object, e As EventArgs)_
Handles Btn_Connect5000.Click
' Connecting to server
tcpclnt1 = New TcpClient
tcpclnt1.Connect("192.168.1.177", 5000)
streamTcp1 = tcpclnt1.GetStream() 'Create stream for current tcpClient
' HERE WE START TO READ
streamTcp1.BeginRead(DataBuffer, 0, DataBuffer.Length, evtDataArrival, Nothing)
End Sub
Public Sub DataProcessing(ByVal dr As IAsyncResult)
numberOfBytes = streamTcp1.EndRead(dr) 'END READ
' ...HERE SOME ROUTINE FOR PRINT DATA TO TEXTBOXES...
'START NEW READING
streamTcp1.BeginRead(DataBuffer, 0, DataBuffer.Length, evtDataArrival, Nothing)
End Sub
Private Sub Btn_Disconnect5000_Click(sender As Object, e As EventArgs)_
Handles Btn_Disconnect5000.Click
' Disconnect from port 5000. Close TcpClient
streamTcp1.Dispose()
streamTcp1.EndRead(Nothing) 'And here mistake appears !!!
streamTcp1.Close()
tcpclnt1.Close()
End Sub
End Class
问题:我创建了新客户端和新流。据我了解,通过使用BeginRead,它开始在新线程中读取数据。所以为了实时数据,我在DataProcessing函数的末尾开始新的BeginRead。但是我在尝试断开连接时遇到了问题(查看Btn_Disconnect5000_Click 函数):我尝试关闭流和客户端,但它仍然尝试在DataProcessing 方法中读取并告诉我:
无法访问已处置的对象
(感谢 djv 的正确翻译!)。
所以我想我需要先停止线程但不知道如何做到这一点:我尝试了Dispose() 方法,先尝试关闭流但仍然不能。我也尝试手动调用EndRead 方法,但无法理解我必须分配给它作为参数(参数)的内容。
【问题讨论】:
-
您的异常消息的英文翻译是Cannot access a disposed object
-
正如莲花链接中的答案所建议的那样,尝试关闭
NetworkStream而不是调用EndRead(我的回答在某种程度上解释了为什么你也不需要在那里调用EndRead)。 -
很高兴您提出与 TCP 相关的问题!这是我的专长之一,但在 VB.NET 中很少有任何 TCP 问题,而 C# 中的问题要么是我无法回答的问题,要么是 OP 复制粘贴整个应用程序的问题。 ;)
-
@VisualVincent 我也很高兴!因为通常这样的问题是一个高度专业化的问题,找到答案真的很棘手:) 我真的很感谢你的帮助!我很高兴你发现它们很有趣!
标签: .net vb.net sockets io networkstream