Projekt zyklisches Senden und Empfangen von Http Daten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Projekt zyklisches Senden und Empfangen von Http Daten

    Hallo liebe Gemeinde,

    ich bin neu und ein Programmieranfänger und suche nun keinen fertigen Code - denn ich möchte lernen - sondern Denkanstöße, Strukturaufbauten, Tipps usw.

    Ich möchte kurz beschreiben, um was es eigentlich geht:

    Über eine Oberfläche gebe ich diverse Daten ein. Danach starte ich eine neue Klasse und füge die Daten über Property´s in eine Methode. (zukünftig sollen dort noch Abfragen erfolgen - Konsistenzprüfung z.B.)

    Danach starte ich die Methode, die den httpWebRequest mit den Eingabedaten - die schon funktioniert. Nun scheitere ich daran, dass ich diesen Request gerne alle x min (Eingabe über die erste Maske) erneut starten möchte.
    Ich habe mich an der Timer-Klasse versucht und auch diese in Funktion gebracht. Doch leider sind die Daten dann nicht mehr da, so dass die nächste Abfrage leer bleibt. Die erste Abfrage funktioniert super --> Daten kommen und sind auf der Oberfläche sichtbar.

    Muss ich dazu die Klasse immer wieder neu instanziieren? Mir ist die Laufzeit, Gültigkeit einer instanziierten Klasse mit den Daten noch nicht ganz klar. Sind die Eingabedaten aus der Klasse weg? Muss ich die vllt. in ein Cache packen?

    Später soll es so aussehen, dass diese eingegebenen Daten "gespeichert" werden (zur Laufzeit des Programms) und es parallel mehrere Request geben soll, die alle x min neu starten und die Daten zurück an die Oberfläche geben.

    Aktuell habe ich folgende Dateien:

    AWB.vb & Oberfläche --> dort starte ich eine neue Instanz der Klasse Bacnet (die sich in der bacnet.vb befindet), eine neue Timerinstanz (befindet sich ebenfalls in der bacnet.vb) und ich hole die Daten aus der Klasse bacnet wieder ab

    bacnet.vb --> Dort befinden sich diverse Methoden (httpWebRequest), Timerabarbeitung und die Sub für das Ereignis. Aus dem Ereignis-Sub starte ich den Sub mit dem Webrequest wieder neu.

    Ein Gedanke war von mir noch:

    Wenn ich die Daten nach der Eingabe direkt "abspeichere" (Ich habe im Internet den Begriff Collection aufgegriffen) und diese dort wieder auslese, dem Sub des Requestes übergebe, müsste es eigentlich funktionieren. ?(

    Und für die, die es ganz genau wissen möchten:

    Ich möchte Wetterdaten zu mehreren Orten zyklisch abfragen und die über BACnet in ein GA-System schicken. Das Thema mit Bacnet ist soweit fertig.

    Ich habe die SuFu schon benutzt. Leider fehlen mir die Begriffe, nach denen ich suchen muss und ich habe noch so einige Verständnisprobleme mit der Timer-Klasse. (Handler usw.) Ich habe die MSDN schon gelesen und andere Tut´s usw.

    War ich verständlich ? 8|

    Nicht steinigen, bitte. :saint:

    Liebe Grüße

    Robert

    Ps: Falls ich Begrifflichkeiten falsch verwendet habe, bitte ich um Berichtigung. :)
    Also normalerweise würde man im Timer.Tic Event eine Methoden aufrufen, welche deine Abfrage und den Rest startet. Wenn die einmal klappt, klappt sie i.d.R. Immer. Außer sie verändert etwas in der Oberfläche, was dann bei der nächsten Abfrage verwendet wird.

    Wie wärs mit einem bischen Code? Ansonsten kann man nur raten und glaskugeln.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Willkommen im Forum. :thumbup:

    Fahrstuhllicht schrieb:

    Doch leider sind die Daten dann nicht mehr da
    Du brauchst eine HTTP-Klasse, die während der Laufzeit Deines Programms instanziiert bleibt.
    Diese Klasse enthält alle Properties, die benötigt werden.
    Änderungen an der GUI überträgst Du im Change-Event der Controls an die Properties dieser Instanz, so dass deren Daten stets aktuell sind.
    Wenn Du auf den Knopf drückst oder wenn der Timer tickt, nimmst Du diese Properties und los.
    Feddich. :D
    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!
    AWB.vb

    VB.NET-Quellcode

    1. Public Class AWB
    2. Event akt_timer As ElapsedEventHandler
    3. Private Sub btn_xml_Click(sender As Object, e As EventArgs) Handles btn_xml.Click
    4. XML.Show()
    5. End Sub
    6. Private Sub btn_bacstart_Click(sender As Object, e As EventArgs) Handles btn_bacstart.Click
    7. Dim var_timer As Double
    8. var_timer = tb_akt_zeit.Text * 60 * 1000
    9. If var_timer <= 10000 Then
    10. Debug.WriteLine("zu klein")
    11. Exit Sub
    12. Else
    13. 'Timerinstanz
    14. Dim zeit As New Time
    15. zeit.Timerrefresh(var_timer)
    16. 'Wetterinstanz
    17. Wetterinstanz()
    18. End If
    19. End Sub
    20. Private Sub Wetterinstanz()
    21. Dim wetter As New bacnet
    22. wetter.p_pid = tb_pid.Text
    23. wetter.p_ort = tb_ort.Text
    24. wetter.wd_aktuell()
    25. XML.tb_xml.Text = wetter.p_data
    26. End Sub
    27. Private Sub Bacnetserver()
    28. Dim server As New BACnetServerDevice
    29. server.Id = tb_bid.Text
    30. server.Name = tb_bn.Text
    31. BACnetAPI.Initialize()
    32. BACnetAPI.SetServerDevice(server)
    33. End Sub
    34. End Class


    bacnet.vb

    VB.NET-Quellcode

    1. Public Class bacnet
    2. Dim id As String
    3. Dim pid As String
    4. Dim plz As Integer
    5. Dim ort As String
    6. Dim url As String
    7. Dim time As Integer
    8. Dim wr_timeout As Integer
    9. Dim sr_timeout As Integer
    10. Dim request As HttpWebRequest
    11. Dim response As HttpWebResponse
    12. Dim stream As Stream
    13. Dim reader As StreamReader
    14. Dim data As String
    15. Public Property p_ort() As String
    16. Get
    17. Return ort
    18. End Get
    19. Set(value As String)
    20. ort = value
    21. End Set
    22. End Property
    23. Public Property p_pid() As String
    24. Get
    25. Return pid
    26. End Get
    27. Set(value As String)
    28. pid = value
    29. End Set
    30. End Property
    31. Public ReadOnly Property p_data() As String
    32. Get
    33. Return data
    34. End Get
    35. End Property
    36. Public Sub Wd_vorhersage()
    37. 'Angaben in ms
    38. wr_timeout = 1000
    39. sr_timeout = 2000
    40. 'pid = "11d2583d91bb3a447c30ad0fd2276f47"
    41. url = "http://api.openweathermap.org/data/2.5/forecast?q=" & ort & ",DE&mode=xml&appid=" & pid & "&units=metric&lang=de"
    42. 'Instanzieren einer Verbindung
    43. request = HttpWebRequest.Create(url)
    44. 'Eigenschaften der Verbindungen
    45. request.AllowAutoRedirect = False
    46. request.KeepAlive = False
    47. request.Timeout = wr_timeout
    48. request.ReadWriteTimeout = sr_timeout
    49. 'Senden der Anfrage
    50. response = request.GetResponse()
    51. If response.StatusCode = HttpStatusCode.OK Then
    52. 'Gibt den Stream der Anfrage frei
    53. stream = response.GetResponseStream()
    54. 'Daten auslesen
    55. reader = New StreamReader(stream)
    56. data = reader.ReadToEnd()
    57. reader.Close()
    58. response.Close()
    59. End If
    60. End Sub
    61. Public Sub wd_aktuell()
    62. 'Angaben in ms
    63. wr_timeout = 1000
    64. sr_timeout = 2000
    65. 'pid = "11d2583d91bb3a447c30ad0fd2276f47"
    66. url = "http://api.openweathermap.org/data/2.5/weather?q=" & ort & ",DE&mode=xml&appid=" & pid & "&units=metric&lang=de"
    67. 'Instanzieren einer Verbindung
    68. request = HttpWebRequest.Create(url)
    69. 'Eigenschaften der Verbindungen
    70. request.AllowAutoRedirect = False
    71. request.KeepAlive = False
    72. request.Timeout = wr_timeout
    73. request.ReadWriteTimeout = sr_timeout
    74. 'Senden der Anfrage
    75. response = request.GetResponse()
    76. If response.StatusCode = HttpStatusCode.OK Then
    77. 'Gibt den Stream der Anfrage frei
    78. stream = response.GetResponseStream()
    79. 'Daten auslesen
    80. reader = New StreamReader(stream)
    81. data = reader.ReadToEnd()
    82. reader.Close()
    83. response.Close()
    84. End If
    85. End Sub
    86. End Class
    87. Public Class Time
    88. Inherits bacnet
    89. Public Sub Timerrefresh(ByVal x As Double)
    90. Dim akt_refresh As New Timer()
    91. akt_refresh.Interval = x
    92. akt_refresh.AutoReset = True
    93. akt_refresh.Enabled = True
    94. AddHandler akt_refresh.Elapsed, AddressOf repeat
    95. End Sub
    96. Sub repeat(source As Object, e As ElapsedEventArgs)
    97. wd_aktuell()
    98. End Sub
    99. End Class
    Man kann erkennen, dass du Option Strict Off programmierst.
    Also ganz ohne auf die Problemstellung einzugehen: Visual Studio - Empfohlene Einstellungen ist jetzt die erste Sofortmassnahme.
    Man kann ebenfalls erkennen, dass du mit unterschiedlichen Typen richtig umzugehen versuchst - wie gesagt: die Empfohlenen Einstellungen sind da eine unschätzbare Hilfe.

    Fahrstuhllicht schrieb:

    Wird heute Abend aktiviert
    Dann aktivier das auch gleich im Studio, dass es für alle weiteren Projekte On ist.
    Die Vorgabe von Microsoft ist hier leider voll vor den Ar... . ;(
    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!
    Jap. Habe gerade in dem verlinkten Post gesehen, dass es zentral einstellbar ist.
    Da bin ich mal gespannt, was mich erwartet. Das Thema der Typenreinheit ist nichts Neues für mich, da ich es aus der Programmierung im Elektrobereich für SPS kenne. Umso mehr ärgert es mich, dass ich im guten Glauben war, dass es aktiviert ist und schon stolz war, dass es diesbezüglich keine Probleme gab. Nun weiß ich warum.
    Übrigens kannst Du Deine Properties wie Folgt abkürzen:

    VB.NET-Quellcode

    1. Dim ort As String
    2. Public Property p_ort() As String
    3. Get
    4. Return ort
    5. End Get
    6. Set(value As String)
    7. ort = value
    8. End Set
    9. End Property
    machst Du

    VB.NET-Quellcode

    1. Public Property p_ort() As String
    ======================

    Fahrstuhllicht schrieb:

    VB.NET-Quellcode

    1. XML.Show()
    Was ganz genau ist XML?
    Der Name einer Form-Klasse
    oder
    der eine Variable vom Typ einer Form-Klasse?
    Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!
    Jap der Name einer Form. Ist aber nur zu Testzwecken gewesen.
    Die Daten, die man empfängt sind im XML Format und damit ich sehe, ob die ausgelesen wurden, habe ich es stümperhaft so gemacht. In der AWB.vb befindet sich die Variablenübergabe in eine Textbox. Aber das fliegt alles wieder raus, wenn das Tool funktioniert.
    problem erkannt, gelesen und wird auch geändert.

    Danke für den Abkürzungstipp. Ich ziehe das das dennoch vor, da ich als Anfänger das besser verstehe und ich mich erstmal nicht fragen muss, was heißt das. Das Set und Get kenne ich aus der php-Sprache

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Fahrstuhllicht“ ()

    So ich habe nun Strict on eingetragen und die aufgetretenen Fehler gelöst. Musste jetzt die Webexeption einfügen, aber klappt.
    Nun stehe ich dennoch vor dem Thema, dass ich zyklisch senden möchte.
    Trage ich in der Ereignis-Sub einfach nochmal eine Klasse instanziiert ein oder gibt es noch eine andere Art und Weise ?

    VB.NET-Quellcode

    1. Sub repeat(source As Object, e As ElapsedEventArgs)
    2. Dim test as New bacnet
    3. test.wd_aktuell()
    4. End Sub


    so ??
    Das wäre quasi das Gleiche, welches in der awb.vb steht ?!
    Oder ist die Idee das über eine Collection zu lösen vllt. besser?
    Die Collection wird vermutlich eh kommen, wenn es nicht noch eine bessere Lösung gibt.
    Oder welche Lösung gäbe es noch ?
    ich kapier nicht, mit welchen Objekten du hantierst.
    EreignisSub von welchem Ereignis von welcher Klasse?
    Und was ist ein bacnet?

    Weiter oben sieht das aus wie iwie ein Device aus ieiner eingebundenen Dll.
    Device kann alles sein, aber üblicherweise kenne ich Device-Dinger als etwas, was man nicht ständig neu erstellen sollte, sondern einmal sich ein Objekt davon einrichten und dann mehrfach benutzen.

    ah - jetzt habichs gesehen - sind ja Klassen von dir.
    Also in Sub Repeat ein neues BacNet zu erstellen ist Unfug, weil Sub Repeat ist ja Member von Time, und Time erbt von BacNet.
    Also Repeat ist in einem BacNet drinne, warum soll es ein neues BacNet erzeugen?
    Ergebnis:

    VB.NET-Quellcode

    1. Public Sub repeat(source As Object, e As ElapsedEventArgs)
    2. wd_aktuell()
    3. End Sub
    So müsste es auch gehen. Nur ist das Unfug, eine Methode zu schreiben mit nur einer Zeile, da kann man die Zeile ja auch direkt aufrufen.
    Jetzt noch paar GuideLines:
    Bei Alle KlassenMember des Scope angeben (hier: Public) Unterlässt du das gelten Default-Einstellungen - die sind aber nicht so, wie man meist denkt, dass sie sind.
    Und minimale Namenskonventionen: Klassen und KlassenMember werden PascalCase geschrieben, also groß.
    Und nur in begründeten Ausnahmefällen Prefixe, sonst keine Prefixe.
    Und ich kann Underscores als Wort-Segmentierer nicht leiden - ich bin für PascalCase. Aber dassis Geschmack_Sache, nur wennde dich für eins entscheidest, bleib dabei. Und wennde mit Underscores leben willst, biste halt Exot.
    Am besten lad dir ein OnlineBook herunter - gugge etwa Entwickler-Ressourcen und Tools, Bücher und WebCasts .

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

    Hi,
    deinen Vorschlag hatte ich zuerst und funktioniert nicht. Ich vermute, dass die Variablen, die übergeben und in den Link eingefügt werden, nicht mehr vorhanden sind, da ich diese beim ersten Aufruf übergebe (Property).
    Scopes werde ich nachtragen, danke für den Tipp. Ich bin mir selbst noch nicht sicher, welche Namenskonvertierung ich nutze. Daher Danke für die Anmerkung. Werde mir das mal anschauen. Den Hinweisen onlinebücher, MSDN zu nutzen, nimm ich zur Kenntnis und tue es schon häufig. Doch es ist noch nicht alles so verständlich, wie es für einen erfahrenen Programmierer ist. Deswegen bin ich ja hier. :)

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

    Fahrstuhllicht schrieb:

    Trage ich in der Ereignis-Sub einfach nochmal eine Klasse instanziiert ein oder gibt es noch eine andere Art und Weise ?
    Meinst Du so was:

    VB.NET-Quellcode

    1. Private test as New bacnet
    2. Private repeat(source As Object, e As ElapsedEventArgs)
    3. test.wd_aktuell()
    4. End Sub
    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!

    Fahrstuhllicht schrieb:

    weil die Variablen ja dennoch fehlen.
    Dann musst Du die Variablen halt belegen.
    Mach Dir da ne Sub draus, in der wird test instanziiert und eas werden die Variablen belegt.
    Diese Sub rufst Du dann im Konstruktor oder an einer anderen passenden Stelle auf.
    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!
    So ich hoffe, dass ich das richtig verstanden und angewendet habe. Muss noch nen bisschen aufräumen.

    Bacnet.Vb

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.IO
    4. Imports System.Net
    5. Imports Inneasoft.BACnet
    6. Imports System.Timers
    7. Public Class Bacnet
    8. Private Id As String
    9. Private Pid As String
    10. Private Plz As Integer
    11. Private Ort As String
    12. Private Url As String
    13. Private Time As Integer
    14. Private WrTimeout As Integer
    15. Private SrTimeout As Integer
    16. Private Request As WebRequest
    17. Private Response As WebResponse
    18. Private Stream As Stream
    19. Private Reader As StreamReader
    20. Private Data As String
    21. Private EMessage As String
    22. Private RMessage As String
    23. Public Property POrt() As String
    24. Get
    25. Return Ort
    26. End Get
    27. Set(value As String)
    28. Ort = value
    29. End Set
    30. End Property
    31. Public Property PPid() As String
    32. Get
    33. Return Pid
    34. End Get
    35. Set(value As String)
    36. Pid = value
    37. End Set
    38. End Property
    39. Public ReadOnly Property PData() As String
    40. Get
    41. Return Data
    42. End Get
    43. End Property
    44. Public ReadOnly Property PEmessage As String
    45. Get
    46. Return EMessage
    47. End Get
    48. End Property
    49. Public ReadOnly Property PRmessage As String
    50. Get
    51. Return RMessage
    52. End Get
    53. End Property
    54. Public Sub WdVorhersage()
    55. Try
    56. 'Angaben in ms
    57. WrTimeout = 1000
    58. 'sr_timeout = 2000
    59. 'pid = "11d2583d91bb3a447c30ad0fd2276f47"
    60. Url = "http://api.openweathermap.org/data/2.5/forecast?q=" & Ort & ",DE&mode=xml&appid=" & Pid & "&units=metric&lang=de"
    61. 'Instanzieren einer Verbindung
    62. Request = WebRequest.Create(Url)
    63. 'Eigenschaften der Verbindungen
    64. 'request.AllowAutoRedirect = False
    65. 'request.KeepAlive = False
    66. Request.Timeout = WrTimeout
    67. 'request.ReadWriteTimeout = sr_timeout
    68. 'Senden der Anfrage
    69. Response = Request.GetResponse()
    70. 'Gibt den Stream der Anfrage frei
    71. Stream = Response.GetResponseStream()
    72. 'Daten auslesen
    73. Reader = New StreamReader(Stream)
    74. Data = Reader.ReadToEnd()
    75. Reader.Close()
    76. Response.Close()
    77. Catch e As WebException
    78. If e.Status = WebExceptionStatus.ProtocolError Then
    79. Debug.WriteLine(e.Response)
    80. End If
    81. End Try
    82. End Sub
    83. Public Sub WdAktuell()
    84. Try
    85. 'Angaben in ms
    86. WrTimeout = 1000
    87. 'sr_timeout = 2000
    88. 'pid = "11d2583d91bb3a447c30ad0fd2276f47"
    89. Url = "http://api.openweathermap.org/data/2.5/weather?q=" & Ort & ",DE&mode=xml&appid=" & Pid & "&units=metric&lang=de"
    90. 'Instanzieren einer Verbindung
    91. Request = WebRequest.Create(Url)
    92. 'Eigenschaften der Verbindungen
    93. 'request.AllowAutoRedirect = False
    94. 'request.KeepAlive = False
    95. Request.Timeout = WrTimeout
    96. 'request.ReadWriteTimeout = sr_timeout
    97. 'Senden der Anfrage
    98. Response = Request.GetResponse()
    99. 'Gibt den Stream der Anfrage frei
    100. Stream = Response.GetResponseStream()
    101. 'Daten auslesen
    102. Reader = New StreamReader(Stream)
    103. Data = Reader.ReadToEnd()
    104. If Reader.EndOfStream = True Then
    105. If Data.Length > 1 Then
    106. RMessage = "Daten erfolgreich empfangen!"
    107. End If
    108. End If
    109. Reader.Close()
    110. Response.Close()
    111. Catch e As WebException
    112. If e.Status = WebExceptionStatus.ProtocolError Then
    113. EMessage = e.Message
    114. End If
    115. End Try
    116. End Sub
    117. End Class
    118. Public Class Time
    119. Inherits Bacnet
    120. Public Sub Timerrefresh(ByVal x As Double)
    121. Dim AktRefresh As New Timer()
    122. AktRefresh.Interval = x
    123. AktRefresh.AutoReset = True
    124. AktRefresh.Enabled = True
    125. AddHandler AktRefresh.Elapsed, AddressOf Repeat
    126. End Sub
    127. Sub Repeat(source As Object, e As ElapsedEventArgs)
    128. WdAktuell()
    129. End Sub
    130. End Class

    AWB.vb

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.IO
    4. Imports System.Net
    5. Imports System.Timers
    6. Imports Inneasoft.BACnet
    7. Public Class AWB
    8. Private VarTimer As Double
    9. Private wetter As New Bacnet
    10. Private server As New BACnetServerDevice
    11. Event AktTimer As ElapsedEventHandler
    12. Private Sub btnXml_Click(sender As Object, e As EventArgs) Handles btnXml.Click
    13. XML.Show()
    14. End Sub
    15. Private Sub btnBacstart_Click(sender As Object, e As EventArgs) Handles btnBacstart.Click
    16. VarTimer = Convert.ToDecimal(tbAktZeit.Text) * 60 * 1000
    17. If VarTimer <= 10000 Then
    18. Debug.WriteLine("zu klein")
    19. Exit Sub
    20. Else
    21. 'Timerinstanz
    22. Dim zeit As New Time
    23. zeit.Timerrefresh(VarTimer)
    24. 'Wetterinstanz
    25. Wetterinstanz()
    26. End If
    27. End Sub
    28. Private Sub Wetterinstanz()
    29. wetter.PPid = tbPid.Text
    30. wetter.POrt = tbOrt.Text
    31. wetter.WdAktuell()
    32. If String.IsNullOrEmpty(wetter.PEmessage) Then
    33. Else
    34. tsStatus.Text = wetter.PEmessage
    35. tsStatus.BackColor = Color.Red
    36. End If
    37. If String.IsNullOrEmpty(wetter.PRmessage) Then
    38. Else
    39. tsStatus.Text = wetter.PRmessage
    40. tsStatus.BackColor = Color.Lime
    41. End If
    42. XML.tbXml.Text = wetter.PData
    43. End Sub
    44. Private Sub Bacnetserver()
    45. server.Id = Convert.ToInt16(tbBid.Text)
    46. server.Name = tbBn.Text
    47. BACnetAPI.Initialize()
    48. BACnetAPI.SetServerDevice(server)
    49. End Sub
    50. End Class

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

    Sieht mir viel zu kompliziert aus. Zwei Sofortmassnahmen:

    1) Schmeiss alle TryCatches raus.
    In diesem Stadium der Entwicklung bist du unbedingt darauf angewiesen, Exceptions auch zu erhalten, wenn sie auftreten. TryCatch fängt Exceptions ab, und behindert damit sehr nachhaltig die Ursachen-Suche, wenn Fehler auftreten.
    Siehe auch: TryCatch ist ein heißes Eisen

    2) Entferne den Kram mit dem Timer.
    Dein Timer ist ein asynchron-Timer, und das macht Dinge sehr kompliziert.
    Löse das Problem erstmal synchron - das ist vielfach einfacher: Einfach einen WinForms-Timer aufs Form ziehen, und wenn der tickt, soll der eine Methode aufrufen, die deine WebRequests ausführt und die Ergebnisse verarbeitet (Anzeige oder whatever).
    Dass das Gui solange blockiert ist erstmal egal - hauptsache die Funktionalität ist ok.
    In einem weiteren Schritt kannst du mittm Async-Pattern Nebenläufigkeit einbauen, oder auch Async-Methoden der Webrequest-Klasse nutzen (aber ich glaub, der Async-Pattern ist das einfachste).

    Noch eine Frage: Die Methode Bacnetserver() - ich sehe garnet, dass die irgendwo aufgerufen wird - überseh ich was, oder ist der gezeigte Code unvollständig?