Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in Microsoft.VisualBasic.dll aufgetreten.

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von BiedermannS.

    Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in Microsoft.VisualBasic.dll aufgetreten.

    Hallo,

    ich hoffe ich bin hier richtig gelandet und jemand von euch kann mir evtl. weiterhelfen..

    ich habe ein Programm, das Zyklisch die Verbindung zum Internet überprüfen soll.

    -besteht keine Verbindung Soll das eine Unterprogramm abgearbeitet werden
    -besteht eine Verbindung soll das andere Unterprogramm abgearbeitet werden

    Dies habe ich versucht durch einen Timer zu realisieren, der eine Variable Hochzählt, die im Verlauf des Programmes wieder auf 0 gesetzt wird.
    Das Programm läuft auch, nur leider Stürzt es nach einer gewissen Laufzeit ab... (zwischen 3 tagen bis 2 Wochen)

    jetzt habe ich gesehen das In Visual Basic im Direkt Fenster folgende Meldung angezeigt wird:
    Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in Microsoft.VisualBasic.dll aufgetreten.



    dieser Meldung wird nur angezeigt, wenn keine Internetverbindung besteht und Die Variable "Zeit" nach 3 Sekunden wieder auf 0 zurück gesetzt wird.
    wie kann ich diesen Fehler vermeiden? ?(
    Bin noch Programmieranfänger und habe bis jetzt hauptsächlich Microcontroller mit Bascom Programmiert


    Gruß Hübi



    VB.NET-Quellcode

    1.  
    2. Public Class Form1
    3. Dim siteResponds As Boolean = False
    4. Dim zeit As Double
    5. Dim Zeit_Schnell As Double
    6. ' ********************************************************************************
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    8. Handles MyBase.Load
    9. Timer1.Start() 'starte Timer1
    10.  
    11. End Sub
    12. ' ********************************************************************************
    13. '
    14.  
    15. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    16.  
    17.  
    18.  
    19. zeit = zeit + 1 'Addiere bei ablauf des Timers Variable Zeit + 1
    20. Zeit_Schnell = Zeit_Schnell + 1 'Addiere bei ablauf des Timers Variable Zeit_schnell + 1
    21.  
    22.  
    23.  
    24. '-------------------------------Takt für aktualisierung der Label----------------------------------
    25. If Zeit_Schnell > 0 Then 'Wenn Variable Zeit_schnell größer als 0 (100ms)ist, dann
    26. Label1.Text = CStr(zeit) 'schreibe variable "Zeit" in Label1
    27. Zeit_Schnell = 0 'Setze Variable Zeit_Schnell auf 0
    28. End If
    29. '-------------------------------Takt für abfrage der Verbindung-----------------
    30. If zeit > 29 Then 'Wenn Variable Zeit größer als 29 (3Sekunden) ist, dann
    31. Abfrage_Verbindung() 'gehe zu Unterprogramm
    32. End If
    33. '-------------------------------Takt für aufruf des Hauptprograms-----------------------------
    34. If zeit > 99 Then 'Wenn Variable Zeit größer als 99 (10 Sekunden) ist, dann
    35. zeit = 0 'Setze Variable Zeit auf 0
    36. HAUPT_UNTERPROGRAMM() 'Gehe zu Unterprogramm
    37. End If
    38. End Sub
    39. '----------------------------------------------Haupt Programm----------------------------------------
    40. Sub HAUPT_UNTERPROGRAMM()
    41. MessageBox.Show("Hauptprogram wird ausgeführt")
    42. If siteResponds = False Then
    43. Return
    44. End If
    45. End Sub
    46. '---------------------------------------------Unterprogram Abfrage Verbindung------------------------
    47.  
    48. Sub Abfrage_Verbindung()
    49. Try 'Versuche:
    50. siteResponds = My.Computer.Network.Ping("www.google.com") 'Website Google.de anzupingen
    51. Catch 'wenn gefunden, dann
    52. siteResponds = False 'setze Variable siteResponds auf False
    53. Label2.Text = "es besteht keine Internet Verbindung" 'Zeige Text "es besteht keine Internet Verbindung"
    54. zeit = 0 ' HIER WIRD DER FEHLER VERURSACHT!!!!!!!!!!!!!!!!!
    55.  
    56. End Try
    57. If siteResponds = True Then 'Wenn Variable siteResponds True ist, dann
    58. Label2.Text = "Verbindung mit Internet besteht" 'Zeige text "Verbindung mit Internet besteht"
    59. End If
    60.  
    61.  
    62. End Sub
    63.  
    64.  
    65. '-------------------------------------------------------------------------
    66.  
    67.  
    68. End Class

    Hübi schrieb:

    Stürzt es nach einer gewissen Laufzeit ab
    Willkommen im Forum. :thumbup:
    Leider kann ich Deinen Effekt nicht reproduzieren, da ich keine Lust habe, Deinen Code 3 Tage bis 2 Wochen laufen zu lassen. ;(
    Zunächst denke ich jedoch, dass Dein Programm nicht das macht, was Du Dir einbildest, was es tun soll:
    • Unter genau welchen Bedingungen soll Frau Google angepingt werden?
    • Wann wird in Deinem Programm Frau Google angepingt?
    • Stürzt Dein Programm häufiger / seltener ab, wenn Du das Timer-Intervall verringerst / erhöhst?
    • In welcher Zeile wird die Exception ausgelöst?
    • Wie viele MessageBoxen sind da zu sehen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Hi und willkommen hier im Forum.

    Was mir als erstes auffällt ist das du zum prüfen der Internetverbindung einen Try catch Block verwendest.

    Also einen solchen Block sollte man nur verwenden wenn man weis das an einer bestimmten Stelle ein Programmfehler auftreten kann den ich als Programmierer nicht auf andere weise verhindern kann. Um dem Programm dann einen "sauberen Absturz" zu ermöglichen nutzt man einen Try Catch Block... aber nicht als Abfrage.

    VB.NET-Quellcode

    1. If My.Computer.Network.Ping("www.google.com") Then
    2. MsgBox("Server pinged successfully.")
    3. Else
    4. MsgBox("Ping request timed out.")
    5. End If


    Mein Schnipsel macht das gleiche wie deines auch. Aber ich Produziere keinen Fehler ;)
    danke für die schnellen Antworten

    @ Rodfromgermany

    -alle 3 Sekunden
    - in Zeile 59 wird zum Unterprogram "Abfrage_Verbindung()" gesprungen (Zeile 95)
    - kann ich nicht wirklich sagen ist ziemlich sporadisch
    -Zeile 107 Vermute ich- wenn ich "Zeit = 0" ausklammer wird die Meldung nicht angezeigt
    -der Fehler erscheint nicht in einer Messagebox, er ist nur unten im Direktfenster zu sehnen und wird immer ausgelöst nachdem die Variable Zeit von 30 auf 0 zurückgesetzt wird

    @Cell

    habe es mal mit deinem Code probiert, leider das gleiche Ergebnis...
    das Programm lässt sich damit nicht einmal in Dauer ausführen, bei meinem Code wird der Fehler scheinbar ignoriert

    VB.NET-Quellcode

    1. Sub Abfrage_Verbindung()
    2.  
    3. If My.Computer.Network.Ping("www.google.com") Then
    4.  
    5. siteResponds = True
    6. Label2.Text = "Verbindung mit Internet besteht"
    7. Else
    8. siteResponds = False
    9. Label2.Text = "es besteht keine Internet Verbindung" 'Zeige Text "es besteht keine Internet Verbindung"
    10. zeit = 0
    11.  
    12.  
    13. End If
    14. end sub
    du meinst so?

    der Fehler tritt leider genauso wie vorher auf

    VB.NET-Quellcode

    1. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2.  
    3. Timer1.Stop()
    4. zeit = zeit + 1 'Addiere bei ablauf des Timers Variable Zeit + 1
    5. Zeit_Schnell = Zeit_Schnell + 1 'Addiere bei ablauf des Timers Variable Zeit_schnell + 1
    6.  
    7.  
    8.  
    9. '-------------------------------Takt für aktualisierung der Label----------------------------------
    10. If Zeit_Schnell > 0 Then 'Wenn Variable Zeit_schnell größer als 0 (100ms)ist, dann
    11. Label1.Text = CStr(zeit) 'schreibe variable "Zeit" in Label1
    12. Zeit_Schnell = 0 'Setze Variable Zeit_Schnell auf 0
    13. End If
    14. '-------------------------------Takt für abfrage der Verbindung-----------------
    15. If zeit > 29 Then 'Wenn Variable Zeit größer als 29 (3Sekunden) ist, dann
    16. Abfrage_Verbindung() 'gehe zu Unterprogramm
    17. End If
    18. '-------------------------------Takt für aufruf des Hauptprograms-----------------------------
    19. If zeit > 99 Then 'Wenn Variable Zeit größer als 99 (10 Sekunden) ist, dann
    20. zeit = 0 'Setze Variable Zeit auf 0
    21. HAUPT_UNTERPROGRAMM() 'Gehe zu Unterprogramm
    22. End If
    23. Timer1.Start()
    24. End Sub
    Der Fehler liegt nicht an der Variable Zeit die auf 0 gesetzt wird sondern danach


    VB.NET-Quellcode

    1. If zeit > 99 Then 'Wenn Variable Zeit größer als 99 (10 Sekunden) ist, dann
    2. zeit = 0 'Setze Variable Zeit auf 0
    3. HAUPT_UNTERPROGRAMM() 'Gehe zu Unterprogramm
    4. End If



    Nachdem zu die Variable Zeit auf 0 gesetzt Hast rufst du in deinem Programm die Prozedur HAUPT_UNTERPROGRAMM() auf.

    Wenn ich mir diese Prozedur ansehe fällt mir als erstes der Return Befehl auf der hier nicht hin gehört.


    VB.NET-Quellcode

    1. Sub HAUPT_UNTERPROGRAMM()
    2. MessageBox.Show("Hauptprogram wird ausgeführt")
    3. If siteResponds = False Then
    4. Return
    5. End If
    6. End Sub




    Der Return Befehl ist für Funktionen gedacht. der Unterschied zwischen Funktionen und Prozeduren ist, dass eine Funktion immer einen Wert zurück gibt. Eine Prozedur dagegen kann aber keinen Wert zurückgeben.

    Beispiel einer Funktion

    VB.NET-Quellcode

    1. Private Funktion multiplikation() as Decimal 'Hier kann man schon deutlich sehen, dass hier ein Wert vom Typ Decimal zurückgegeben wird
    2. Return 5*4 ' Mit dem Return Befehl übergibt die Funktion den anschließeden Wert
    3. End Function


    Eine Prozedur dagegen hat keinen Datentyp weil es ja auch nichts übergeben kann. Also kann es mit deinem Return auch nichts anfangen und wirft desswegen einen Fehler
    du meinst so?

    Ja das meinte ich, dass solltest du generell so halten der Timer läuft ja weiter und wird eventuell ernuet gefeuert bevor deine Methoden -Aufrufe abgearbeitet wurden.
    Der Fehler selbst dürte an dem Ping liegen. Wenn ich mich nicht irre behergergt die VisualBasic.dll den NameSpace My. Daher ist davon auszugehen das hier das Problem ist.

    Ein kleines Beispiel für einen Ping
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function IsHostAvailable(host As String) As Boolean
    2. Using ping As New System.Net.NetworkInformation.Ping()
    3. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(host, 2000)
    4. ' 2000 setzt ein TimeOut für den Ping
    5. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    6. Return True
    7. Else
    8. Return False
    9. End If
    10. End Using
    11. End Function


    Aufrufen kannst du das dann so
    Spoiler anzeigen

    VB.NET-Quellcode

    1. if (siteResponse = IsHostAvailable("http://www.google.de")) Then
    2. Label2.Text = "Verbindung mit Internet besteht"
    3. Else
    4. Label2.Text = "es besteht keine Internet Verbindung"
    5. End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()


    Der Fehler selbst dürte an dem Ping liegen. Wenn ich mich nicht irre behergergt die VisualBasic.dll den NameSpace My. Daher ist davon auszugehen das hier das Problem ist.


    Er bekommt eine InvalidOperatonException
    Die Ausnahme, die ausgelöst wird, wenn der Aufruf einer Methode aufgrund des aktuellen Zustands des Objekts ungültig ist.

    Das kann wohl kaum an dem Ping liegen. Dieser Fehler wird ausgelöst weil er eine Prozedur wie eine Funktion behandelt. Und ihr eine Variable zuweisen will. Da man Prozeduren keine Variablen zuweisen kann knallts dann.
    @Cell
    ich habe es mal ohne Return ausprobiert, -keine Besserung außerdem kommt die Meldung InvalidOperatonException nur wenn das HAUPT_UNTERPROGRAMM()
    gar nicht ausgeführt wird.

    @Fakiz
    habe dein Beispiel einmal versucht zu benutzen. Leider zeigt es mir hier eine Ausnahme des Typs "System.Net.NetworkInformation.PingException" in Zeile 119 sobald die Variable Zeit bis 30 gezählt hat.


    VB.NET-Quellcode

    1.  
    2.  
    3. Option Explicit On
    4. Option Strict On
    5. Imports System.Text.RegularExpressions
    6.  
    7.  
    8. Public Class Form1
    9. Dim siteResponds As Boolean '= False
    10. Dim zeit As Double
    11. Dim Zeit_Schnell As Double
    12. ' ********************************************************************************
    13. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    14. Handles MyBase.Load
    15. Timer1.Start() 'starte Timer1
    16. End Sub
    17.  
    18.  
    19.  
    20.  
    21. ' ********************************************************************************
    22. '
    23.  
    24. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    25. Timer1.Stop()
    26.  
    27. zeit = zeit + 1 'Addiere bei ablauf des Timers Variable Zeit + 1
    28. Zeit_Schnell = Zeit_Schnell + 1 'Addiere bei ablauf des Timers Variable Zeit_schnell + 1
    29.  
    30. '-------------------------------Takt für aktualisierung der Label----------------------------------
    31. If Zeit_Schnell > 0 Then 'Wenn Variable Zeit_schnell größer als 0 (100ms)ist, dann
    32. Label1.Text = CStr(zeit) 'schreibe variable "Zeit" in Label1
    33. Zeit_Schnell = 0 'Setze Variable Zeit_Schnell auf 0
    34. End If
    35. '-------------------------------Takt für abfrage der Verbindung-----------------
    36. If zeit > 29 Then 'Wenn Variable Zeit größer als 29 (3Sekunden) ist, dann
    37. If (siteResponds = IsHostAvailable("http://www.google.de")) Then
    38. Label2.Text = "Verbindung mit Internet besteht"
    39.  
    40. '-------------------------------Takt für aufruf des Hauptprograms-----------------------------
    41. If zeit > 99 Then 'Wenn Variable Zeit größer als 99 (10 Sekunden) ist, dann
    42. zeit = 0 'Setze Variable Zeit auf 0
    43. HAUPT_UNTERPROGRAMM() 'Gehe zu Unterprogramm
    44. End If
    45. Else
    46.  
    47. Label2.Text = "es besteht keine Internet Verbindung"
    48. zeit = 0
    49. End If
    50. End If
    51.  
    52. Timer1.Start()
    53. End Sub
    54.  
    55.  
    56. Private Function IsHostAvailable(ByVal host As String) As Boolean
    57. Using ping As New System.Net.NetworkInformation.Ping()
    58. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(host, 2000)
    59. ' 2000 setzt ein TimeOut für den Ping
    60. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    61. Return (True)
    62. Else
    63. Return (False)
    64. End If
    65. End Using
    66. End Function
    67.  
    68. '----------------------------------------------Haupt Programm----------------------------------------
    69. Sub HAUPT_UNTERPROGRAMM()
    70. MessageBox.Show("Hauptprogram wird ausgeführt")
    71.  
    72. End Sub
    73. End Class

    @Hübi Du hast den Fehler nicht bemerkt, den ich meinte.

    Hübi schrieb:

    VB.NET-Quellcode

    1. If zeit > 29 Then
    Hier wird in jedem Durchlauf nach dem 29. Durchlauf die Verbindung getestet. Ist das so gewollt?

    Hübi schrieb:

    VB.NET-Quellcode

    1. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    2. Return (True)
    3. Else
    4. Return (False)
    5. End If
    machst Du ganz einfach

    VB.NET-Quellcode

    1. Return (replay.Status = System.Net.NetworkInformation.IPStatus.Success)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Fakiz
    Super, damit klappt es soweit, das keine Ausnahme mehr auftritt
    nur leider wird jetzt in 95% der abfragen keine Internet Verbindung erkannt :(

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Text.RegularExpressions
    4.  
    5. Public Class Form1
    6. Dim siteResponds As Boolean '= False
    7. Dim zeit As Double
    8. Dim Zeit_Schnell As Double
    9. ' ********************************************************************************
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    11. Handles MyBase.Load
    12. Timer1.Start() 'starte Timer1
    13. End Sub
    14. Private Function IsHostAvailable(ByVal host As String) As Boolean
    15. Using ping As New System.Net.NetworkInformation.Ping()
    16. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(host, 2000)
    17. ' 2000 setzt ein TimeOut für den Ping
    18. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    19. Return (True)
    20. Else
    21. Return (False)
    22. End If
    23. End Using
    24. End Function
    25. ' ********************************************************************************
    26.  
    27. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    28. Timer1.Stop() 
    29. zeit = zeit + 1 'Addiere bei ablauf des Timers Variable Zeit + 1
    30. Zeit_Schnell = Zeit_Schnell + 1 'Addiere bei ablauf des Timers Variable Zeit_schnell + 1
    31.  
    32. '-------------------------------Takt für aktualisierung der Label----------------------------------
    33. If Zeit_Schnell > 0 Then 'Wenn Variable Zeit_schnell größer als 0 (100ms)ist, dann
    34. Label1.Text = CStr(zeit) 'schreibe variable "Zeit" in Label1
    35. Zeit_Schnell = 0 'Setze Variable Zeit_Schnell auf 0
    36. End If
    37. '-------------------------------Takt für abfrage der Verbindung-----------------
    38. If zeit = 29 Then 'Wenn Variable Zeit größer als 29 (3Sekunden) ist, dann
    39. If (siteResponds = IsHostAvailable("google.de")) Then
    40. Label2.Text = "Verbindung mit Internet besteht"
    41. Else
    42. Label2.Text = "es besteht keine Internet Verbindung"
    43. zeit = 0
    44. End If
    45. End If
    46. Timer1.Start()
    47. End Sub
    48. End Class


    @ Rodfromgermany

    Ja, da hast du recht das ist so nicht gewollt- die Abfrage soll nur einmal alle 3 Sekunden erfolgen...

    ich hab aus dem > mal ein = gemacht
    Das liegt daran

    VB.NET-Quellcode

    1. If (siteResponds = IsHostAvailable("google.de")) Then


    änder das in

    VB.NET-Quellcode

    1. siteResponds = IsHostAvailable("google.de")
    2. If (siteResponds) Then


    oder einfach die Variable siteResponds weglassen und nur

    VB.NET-Quellcode

    1. If IsHostAvailable("google.de") Then
    Danke Fakiz
    damit klappt es wenn eine Verbindung besteht- aber jetzt wird sobald keine Internet Verbindung besteht und die Abfrage kommt die Fehlermeldung:
    "PingException wurde nicht behandelt" ausgegeben
    ?(

    muss da noch irgendwie eine Reaktion auf ein negatives Ping eingebaut werden?

    VB.NET-Quellcode

    1.   
    2. Option Explicit On
    3. Option Strict On
    4. Imports System.Text.RegularExpressions
    5.   
    6. Public Class Form1
    7. Dim siteResponds As Boolean '= False
    8. Dim zeit As Double
    9. Dim Zeit_Schnell As Double
    10. ' ********************************************************************************
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    12. Handles MyBase.Load
    13. Timer1.Start() 'starte Timer1
    14. End Sub
    15.  
    16. Private Function IsHostAvailable(ByVal host As String) As Boolean
    17. Using ping As New System.Net.NetworkInformation.Ping()
    18. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(host, 2000)
    19. ' 2000 setzt ein TimeOut für den Ping
    20. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    21. Return (True)
    22. Else
    23. Return (False)
    24. End If
    25. End Using
    26. End Function
    27.  
    28. ' ********************************************************************************
    29. '
    30. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    31. Timer1.Stop()
    32. zeit = zeit + 1 'Addiere bei ablauf des Timers Variable Zeit + 1
    33. Zeit_Schnell = Zeit_Schnell + 1 'Addiere bei ablauf des Timers Variable Zeit_schnell + 1
    34.  
    35. '-------------------------------Takt für aktualisierung der Label----------------------------------
    36. If Zeit_Schnell > 0 Then 'Wenn Variable Zeit_schnell größer als 0 (100ms)ist, dann
    37. Label1.Text = CStr(zeit) 'schreibe variable "Zeit" in Label1
    38. Zeit_Schnell = 0 'Setze Variable Zeit_Schnell auf 0
    39. End If
    40. '-------------------------------Takt für abfrage der Verbindung-----------------
    41. If zeit = 29 Then 'Wenn Variable Zeit größer als 29 (3Sekunden) ist, dann
    42. 'siteResponds = IsHostAvailable("google.de")
    43. 'If (siteResponds) Then
    44. If IsHostAvailable("google.de") Then
    45. Label2.Text = "Verbindung mit Internet besteht"
    46. Else
    47. Label2.Text = "es besteht keine Internet Verbindung"
    48. zeit = 0
    49. End If
    50. End If
    51. '-------------------------------------------------------------------------------------
    52. If zeit > 99 Then
    53. zeit = 0
    54. End If
    55. Timer1.Start()
    56. End Sub
    57. End Class
    Diese Exception musst du abfangen. Das machst du mit einem Try -Catch Block.

    VB.NET-Quellcode

    1. Try
    2. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(host, 2000)
    3. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    4. Return (True)
    5. Else
    6. Return (False)
    7. End If
    8. Catch PingException
    9. Return False
    10. End Try

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Hübi schrieb:

    die Abfrage soll nur einmal alle 3 Sekunden erfolgen...
    Dann schmeiß alle Deine Variablen weg:
    Deine Variable Zeit_Schnell pendelt z.B. nur zwischen 0 und 1.
    Mach Dir nur einen 3-Sekunden-Timer, der jedes Mal das Web abfragst. Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder du verwendest einfach keinen Timer, sondern baust dir eine richtige Klasse die das ordentlich für dich erledigt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class OnlineThread
    2. Public Delegate Sub OnlineThreadCallback(ByVal Online As Boolean)
    3. Public Sub New(ByRef Callback As OnlineThreadCallback, ByVal Host As String, ByVal Interval As Integer)
    4. _Callback = Callback
    5. _Host = Host
    6. _Interval = Interval
    7. End Sub
    8. ' Check if at least one interface is connected
    9. Private Function CheckConnectionState() As Boolean
    10. Dim networkInterfaceList As System.Net.NetworkInformation.NetworkInterface() = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
    11. For Each networkInterface As System.Net.NetworkInformation.NetworkInterface In networkInterfaceList
    12. If networkInterface.OperationalStatus = Net.NetworkInformation.OperationalStatus.Up Then
    13. Return True
    14. End If
    15. Next
    16. Return False
    17. End Function
    18. Private Function CheckIfHostIsReachable(ByVal Host As String) As Boolean
    19. CheckIfHostIsReachable = False
    20. Using ping As New System.Net.NetworkInformation.Ping()
    21. Try
    22. Dim replay As System.Net.NetworkInformation.PingReply = ping.Send(Host, _Interval \ 2)
    23. If replay.Status = System.Net.NetworkInformation.IPStatus.Success Then
    24. CheckIfHostIsReachable = True
    25. End If
    26. Catch
    27. End Try
    28. End Using
    29. End Function
    30. Private Sub Execute()
    31. Dim connected As Boolean = False
    32. While _Running
    33. connected = CheckConnectionState() AndAlso CheckIfHostIsReachable(_Host)
    34. _Callback(connected)
    35. Threading.Thread.Sleep(_Interval)
    36. End While
    37. End Sub
    38. Public Sub StartThread()
    39. _Running = True
    40. _Thread = New Threading.Thread(AddressOf Execute)
    41. _Thread.IsBackground = True
    42. _Thread.Start()
    43. End Sub
    44. Public Sub StopThread()
    45. _Running = True
    46. End Sub
    47. Private _Running As Boolean = False
    48. Private _Host As String
    49. Private _Interval As Integer
    50. Private _Thread As Threading.Thread
    51. Private _Callback As OnlineThreadCallback
    52. End Class


    Verwenden kannst du das ganze dann so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Delegate Sub SetTextDelegate(ByVal args As String)
    3. Private Sub UpdateLabel(ByVal value As String)
    4. Label2.Text = value
    5. End Sub
    6. Private Sub OnOnlineThreadTick(ByVal Online As Boolean)
    7. Dim textDelegate As New SetTextDelegate(AddressOf UpdateLabel)
    8. If Online Then
    9. Me.Invoke(textDelegate, "Online")
    10. Else
    11. Me.Invoke(textDelegate, "Offline")
    12. End If
    13. End Sub
    14. Private Sub btn_Start_Click(sender As Object, e As EventArgs) Handles btn_Start.Click
    15. btn_Stop.Enabled = True
    16. btn_Start.Enabled = False
    17. _OnlineThread.StartThread()
    18. End Sub
    19. Private Sub btn_Stop_Click(sender As Object, e As EventArgs) Handles btn_Stop.Click
    20. btn_Stop.Enabled = False
    21. btn_Start.Enabled = True
    22. _OnlineThread.StopThread()
    23. End Sub
    24. Private _OnlineThread As OnlineThread = New OnlineThread(AddressOf OnOnlineThreadTick, "www.google.com", 3000)
    25. End Class


    Edit:
    Kleiner Nachtrag zu:

    Cell schrieb:

    Dieser Fehler wird ausgelöst weil er eine Prozedur wie eine Funktion behandelt.


    Ein Return heißt nicht, dass eine Methode wie eine Funktion behandelt wird. Man kann in VB.Net keine Methode wie eine Funktion behandeln (zumindest nicht durch Standard Syntax).

    Return bedeutet nur, dass die Funktion an dieser Stelle verlassen wird. Bei Funktionen kann man zusätzlich noch einen Return Wert angeben. Das ist in so ziemlich allen gängigen Programmiersprachen so und absoluter Standard. Wenn man aus einer Methode/Funktion raus will, nutzt man eben Return.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BiedermannS“ ()