2017-09-30 3 views
0

Ich lerne seit ein paar Monaten zu programmieren. Heute möchte ich einen Passwort-Manager programmieren. Alles funktioniert gut, aber die Icon-Funktion hat Probleme, wenn ein Host nicht erreichbar ist. Diese Funktion dient dazu, das Favicon von der Webseite zu bekommen.WebException - Blocking für jede Schleife

  Try 

      For Each myItem As ListViewItem In lv_data.Items 

       Dim baseurl = myItem.Text 
       Dim url As Uri = New Uri(baseurl) 

       If url.HostNameType = UriHostNameType.Dns Then 
        Dim iconURL = "http://" & url.Host & "/favicon.ico" 

        Dim request As System.Net.WebRequest = System.Net.HttpWebRequest.Create(iconURL) 
        Dim response As System.Net.HttpWebResponse = request.GetResponse() 
        Dim stream As System.IO.Stream = response.GetResponseStream() 
        imglist.Images.Add(Image.FromStream(stream)) 
        lv_data.Items.Item(myItem.Index).ImageIndex = myItem.Index 
       End If 

      Next 
     Catch ex As WebException 

     End Try 

Einige Server reagieren mit einer Ausnahme:

Remote-Host nicht

aufgelöst werden konnte

. Wenn das passiert, stoppt das Ganze für jede Schleife. Ich suche nach einer Möglichkeit, diesen Fehler zu ignorieren und mit dem nächsten Element aus der Listenansicht fortzufahren.

Kann mir jemand einen Tipp oder vielleicht eine Lösung geben.

Mit freundlichen Grüßen, Der König

+1

Wenn Sie Ihren try/catch in der foreach bewegen .... weiter, wenn Sie Erhalten Sie die Ausnahme, die Sie mit der nächsten Iteration fortsetzen können. – Steve

+0

Danke nun geht es mit der Schleife weiter. Aber jetzt sind die Icons nicht an der richtigen Stelle. Ich denke, das passiert, wenn ein Server nicht erreichbar ist, er bekommt das Icon vom nächsten funktionierenden Server. –

Antwort

0

zuerst den Versuch fangen innerhalb der Schleife bewegen

For Each myItem As ListViewItem In lv_data.Items 
    Try 

     Dim baseurl = myItem.Text 
     Dim url As Uri = New Uri(baseurl) 
     ... 
    Catch 
    End Try 
Next 

Dieser Code ermöglicht, innerhalb der foreach-Schleife fortzusetzen, wenn es eine Ausnahme trifft das Favicon in abruft. ico

Das nächste Problem ist, wie Sie die Bilder in der Bildliste adressieren. Wenn Sie auf die Ausnahme stoßen, weil Ihr Code das Favicon nicht abrufen kann, fügen Sie der ImageList nichts hinzu.
An dieser Stelle enthalten Ihre ImageList und Ihre ListView.Items nicht die gleiche Anzahl von Elementen, daher können Sie nicht die myItem.Index verwenden, um das Bild in der ImageList zu referenzieren.

Da das Bild jedoch in der vorherigen Zeile zur ImageList hinzugefügt wurde, können Sie sicher sein, dass das erforderliche Bild das letzte Element der ImageList ist. So können Sie die ImageList.Images.Count Eigenschaft verwenden (weniger 1)

imglist.Images.Add(Image.FromStream(stream)) 
myItem.ImageIndex = imgList.Images.Count - 1 

(Beachten Sie, dass Sie direkt myItem in diesem Zusammenhang verwenden)

+0

Vielen Dank. Es klappt. Schlecht zu sagen, die Geschwindigkeit ist sehr langsam. Eine Listenansicht mit etwa 120 Einträgen dauert bis zu 4 Minuten, um die Symbole zu laden. Aber ich denke, das ist das Problem der Webrequest und Ausnahmen. –

+0

Ja, Ausnahmen benötigen eine Menge Zeit, um alle erforderlichen Informationen zu verarbeiten (Stack-Trace usw.). – Steve