Ausnahmefehler während einer WebClient-Anforderung

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    petaod schrieb:

    typischer Streitfall...
    Hurrah - lass ich mir natürlich nicht entgehen! :D
    Also was du ansprichst wäre eine Mikro-Optimierung: Du erkaufst dir einen (insbesondere hier) minimalen Geschwindigkeits-Vorteil, um den Preis etwas höherer Komplexität.
    Komplexität ist nun fast immer die letztendliche Ursache von Programm-Fehlern, und jedes bischen Komplexität summiert sich auf.
    Also da haben wir einen kleinen Cost, und mach sowas 5 mal im Form, dann wird die zunehmende Unleserlichkeit des Codes schon deutlich wahrnehmbar.

    Nun zur Win-Seite:
    Path.GetTempPath ist wirklich sehr schnell, und steht hier in zeitlicher Abfolge mit dem vermutlich um 1000000000% langsameren Download.
    Damit ist völlig ausgeschlossen, dass der Geschwindigkeitsgewinn von 0,00000001% sich jemals irgendwie bemerkbar macht.
    Wir haben also keinen, absolut keinen Win.

    Womit die Kosten-Nutzen-Frage ich finde eindeutig entschieden ist :P

    Wahrscheinlich wäre sogar besser, den WebClient auch von den Class-Vars nach lokal zu verlegen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim url As String = ""
    2. Dim i As Integer = 0
    3. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    4. Using webclient As New Net.WebClient
    5. i += 1
    6. Dim path = IO.Path.Combine(IO.Path.GetTempPath, "tmpimage" & i & ".bmp")
    7. webclient.DownloadFile(url, path)
    8. End Using
    9. End Sub


    Rules Of Optimization

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

    Ja.
    So hat jeder seinen eigenen Programmierstil.
    Ich hätte vermutlich die ganze Logik aus dem Klickevent ausgelagert.
    Damit liesse sich das Geschehen auch von woanders initiieren (ohne einen Klick zu simulieren).
    Und i als Static in die Downloadfunktion genommen.
    Möglicherweise hätte ich sogar noch eine Erfolgsprüfung oder ein Fehlerhandling eingebaut...

    VB.NET-Quellcode

    1. ​Dim url As String = "" 'wo wird die eigentlich gefüllt? Ist das womöglich eine Konstante?
    2. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    3. Dim Filename = DownloadNextFile()
    4. If Filename <> "" Then ...
    5. End Sub
    6. Private Function DownloadNextFile() As String
    7. Static i As Integer = 0
    8. i += 1
    9. Dim path = IO.Path.Combine(IO.Path.GetTempPath, "tmpimage" & i & ".bmp")
    10. Using webclient As New Net.WebClient
    11. Try
    12. webclient.DownloadFile(url, path)
    13. Return path
    14. Catch ex as WebException
    15. i -= 1
    16. End Try
    17. End Using
    18. Return ""
    19. End Sub
    Natürlich hängt es immer auch vom Context ab.
    Was in einem Programm richtig ist, muss im anderen nicht zwingend gut sein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    timonator schrieb:

    Komischerweise schmeißt dein code die gleiche exeption.
    Es ist ein Riesen-Unterschied, ob Code kompiliert, oder ob ein Laufzeitfehler geschmissen wird: Nicht kompilierenden Code kannste garnet starten - bis zum Laufzeitfehler kommste also garnet.
    Und natürlich konnte ich keinen Laufzeit-Test machen, ich hab ja nicht die gewünschte Url.
    Naja, jetzt hab ichs halt mit
    erfinderdesrades.unitweb.de/Pr…r/Downloadpage/index.html
    ausprobiert, und bei mir gehts, also keine Ahnung, was mit deim TempFile ist.


    @petaod: Und gleich einen fiesen Komplexitäts-(oder auch Benamungs-)Fehler aufgedeckt: Die Klassenvariable i wechselwirkt bei mir nämlich mit der Laufvariable i einer ganz anneren Funktion, die garnix mit diesem Test zu tun hat!
    i ist dort eiglich Schleifen-lokal deklariert, referenziert nun aber auf die Klassenvariable i:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim url As String = "http://erfinderdesrades.unitweb.de/Programmer/Downloadpage/index.html"
    2. Dim i As Integer = 0
    3. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    4. Using webclient As New Net.WebClient
    5. i += 1
    6. Dim path = IO.Path.Combine(IO.Path.GetTempPath, "tmpimage" & i & ".bmp")
    7. webclient.DownloadFile(url, path)
    8. End Using
    9. End Sub
    10. Private Sub FillDts()
    11. ADataSet.Clear()
    12. Dim ubound = 16
    13. For i = 0 To ubound 'dieses i ist nun nicht mehr lokal, sondern verändert den Zähler, der eiglich für den Download-Namen gedacht ist.
    Also wirklich danach gucken, die Anzahl Klassenvariablen möglichst klein zu halten!
    Und immer auf aussagekräftige Benamung achten: Eine Klassenvariable (ist hier ja nur durch dein Static-Konstrukt vermeidbar) darf niemals i heißen, denn so heißen lokale Laufvariablen!

    Aber du hast auch voll recht mit den Gewohnheiten: Ich verwende nie lokale statics, obwohl das eiglich optimal gekapselt ist.
    Wohl weils das in c# nicht gibt, und einmal hab ich mir den IL-Code davon angeguckt: also sowas anti-performantes, da kommen selbst mir die Tränen.
    Womit ich mir selbst widerspreche, weil hier ist die Performance der Integer-Instanzierung ja völlig irrelevant. ;(

    Faszit: Würde ich mich an meine eigenen Regeln halten (und ich versuchs ja!), dann würde ich noch sicherer proggen :thumbdown:

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

    Das ist wirklich fies.
    Da hat dir Option Infer On einen Streich gespielt.
    Mit "Off" hätte es funktioniert.
    Da hättest du die Laufvariable mit For i As Integer = 0 To ubound deklarieren müssen.
    Damit wäre ausserhalb der For-Schleife die Klassenvariable aktiv gewesen und innerhalb der Schleife die Laufvariable.

    Es ist das erste Mal, dass ich merke, dass auch die Option Infer Gefahren birgt.

    Edit:
    Ich habe meine Theorie gerade mal in einem kleinen Konsolprogramm getestet

    VB.NET-Quellcode

    1. Module Module1
    2. Dim i As Integer = 2222
    3. Sub Main()
    4. Debug.Print(i) '2222
    5. For i As Integer = 1 To 10
    6. Debug.Print(i) '1..10
    7. xx()
    8. Next
    9. Debug.Print(i) '2222
    10. End Sub
    11. Sub xx()
    12. Debug.Print(i) '2222
    13. End Sub
    14. End Module
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hallo ich wollte grad Euro truck simulator über multiplayer spielen und da kommen ja manchmal updates und jetzt ist folgendes passiert wenn ich versuche ets zu starten im multiplayer dann zeigt Ausnahmefehler
    während einer Web-Client Aufforderung kann mir jemand bitte helfen M.F.G
    @Maik39 Der Thread ist von 2014 und daher tot.
    Eröffne somit bitte ein neues Thema, wo Du Dein Problem ausführlich beschreibst.

    Thema geschlossen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: