J'essaye de lire des données de NetworkStream. J'écris le code suivant:Comment arrêter de lire depuis 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
Problème: Créer de nouveaux clients et de nouveaux flux. En utilisant BeginRead
si je comprends bien, il commence à lire les données dans un nouveau thread. Donc, pour le faire pour les données en temps réel, je commence BeginRead
à la fin de la fonction DataProcessing
. Mais je fais face à ce problème lorsque vous essayez de déconnecter (regardez la fonction Btn_Disconnect5000_Click
): J'essaie de fermer un flux et le client, mais il SILL essayer de lire dans DataProcessing
méthode et me dit:
Cannot access a disposed object
(Merci à DJV pour la traduction correcte !).
Donc je suppose que je dois arrêter le fil d'abord, mais ne peux pas comprendre comment faire ceci: J'ai essayé la méthode Dispose()
, j'ai essayé de fermer le flux en premier mais je ne peux toujours pas. J'ai aussi essayé d'appeler la méthode EndRead
manuellement, mais je ne peux pas comprendre ce que je dois lui assigner comme argument (paramètre).
cela pourrait peut-être aider: http://stackoverflow.com/questions/11785735/proper-way-to-prematurely-abort-beginread-and-beginwrite –
La traduction anglaise de votre message d'exception est * Impossible d'accéder à un objet éliminé * – djv
Comme le suggère la réponse dans le lien de Lotus, essayez simplement de fermer le 'NetworkStream' au lieu d'appeler' EndRead' (ma réponse explique pourquoi vous n'avez pas besoin d'appeler 'EndRead' là non plus). –