Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?quote:Op woensdag 11 maart 2009 13:32 schreef toma het volgende:
[..]
Ik declareer mijn tcpclient aan het begin van het programma als je dat soms bedoeld.
[ code verwijderd ]
Daarna volgt de code die ik vanochtend heb gepost.
Moet ik deze tcpclient dan 'afsluiten' ? Ik snap het niet, maar dat komt ook omdat dit de eerste keer is dat ik met VB.NET werk.
Dat is niet zo zeer het probleem.quote:Op woensdag 11 maart 2009 14:24 schreef Tuvai.net het volgende:
[..]
Een tcpclient object open je altijd met [tcpclient-objectnaam].connect() en dien je weer te sluiten met [tcpclient-objectnaam].close(). Dat doe jij in je stukje code ook, echter zie ik dat jouw Close() commando plaatsvindt in Function Disconnect, die op z'n beurt weer uitgevoerd word door Button2_Click(). Wordt Button2_Click() wel áltijd uitgevoerd? Wordt de tcpclient wel geclosed als je de applicatie bijvoorbeeld gewoon 'afsluit' middels het kruisje van je venster?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | Public Client As New Net.Sockets.TcpClient Public Udpclient As New Net.Sockets.UdpClient Dim packet As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Connectie("10.0.10.99", 10000) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Disconnect() End Sub Function Connectie(ByVal ip As String, ByVal poort As Integer) Try If Client.Connected = 0 Then Client.Connect(ip, poort) TextBox1.Text = ("Connecting") Else TextBox1.Text = ("Already Connected!") End If Catch Exception1 As Net.Sockets.SocketException packet = "h" Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(packet) Udpclient.Send(data, data.Length, ip, 10001) Udpclient.Close() MessageBox.Show("Error 1: " & Exception1.Message) TextBox1.Text = ("Error") Catch Exception2 As ObjectDisposedException Dim Client As New Net.Sockets.TcpClient MessageBox.Show("Error 2: " & Exception2.Message) TextBox1.Text = ("Error") Catch Exception3 As NullReferenceException MessageBox.Show("Error 3: " & Exception3.Message) End Try End Function Function Disconnect() Try Client.Close() TextBox1.Text = ("Disconnecting") Catch Exception1 As Net.Sockets.SocketException MessageBox.Show("Error 4: " & Exception1.Message) TextBox1.Text = ("Error") Catch Exception2 As ObjectDisposedException MessageBox.Show("Error 5: " & Exception2.Message) TextBox1.Text = ("Error") Catch Exception3 As NullReferenceException MessageBox.Show("Error 6: " & Exception3.Message) TextBox1.Text = ("Error") End Try End Function End Class |
Dit verklaart nogal duidelijk waarom je een objectdisposedexception hebt kunnen vangen. Zeker erg onhandig omdat de connectie die er ligt naar je scanner open blijft waardoor een reconnect waarschijnlijk nogal moeilijk wordt (vaak willen dat soort apparaten maar 1 connectie accepteren)quote:Close : Disposes this TcpClient instance without closing the underlying connection.
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 2 3 4 5 6 | Client.Connect(ip, poort) TextBox1.Text = ("Connecting") Else TextBox1.Text = ("Already Connected!") End If |
| 1 2 | Client.Connect(ip, poort) |
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt. Connecties naar apparatuur of databases werken dan weer anders. Je legt een verbinding met iets, en je webpagina/applicatie laat deze verbinding dus voor een tijdje open staan (idle) als je de verbinding niet sluit. Veel apparaten en databases vinden het op z'n beurt weer niet zo leuk om te veel openstaande verbindingen te hebben en hebben daar ook vaak een limiet aan.quote:Op donderdag 12 maart 2009 12:07 schreef toma het volgende:
Bedankt dat was het
Maar waarom moet ik die Client opnieuw declareren? Omdat het object gedisposed is?
FYI: Dat is in het geval van Asp.net en Java absoluut niet zo. Je hebt daar gewoon een application scope. Het is altijd zaak om dit soort objecten netjes op te ruimen, er is geen garantie dat de GC ze kan verwijderen, daarom hebben ze een dispose methode.quote:Op donderdag 12 maart 2009 12:38 schreef Tuvai.net het volgende:
Zodra je objecten disposed, dan gooi je ze 'weg' zoals de handeling al impliceert. Het hele object wordt weggegooid en ook het geheugen dat het betreffende object in beslag nam komt weer vrij. Dit is heel belangrijk in daadwerkelijke applicaties. In bijvoorbeeld webapplicaties hoef je daar veel minder rekening te houden omdat een webpagina op de server á la minute geparsed en na het weergeven/presenteren aan de gebruiker meteen vernietigd wordt.
|
|
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |