WebException — блокировка для каждого цикла

Я учусь кодировать с нескольких месяцев. Сегодня я хочу написать менеджер паролей. Все работает нормально, но функция получения значка имеет проблемы, если хост недоступен. Эта функция предназначена для получения значка с веб-страницы.

           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

Некоторые серверы отвечают Exception :

Удаленный хост не может быть разрешен

. Когда это происходит, все для каждого цикла останавливается. Я ищу способ игнорировать эту ошибку и перейти к следующему элементу из списка.

Может ли кто-нибудь дать мне совет или, может быть, решение.

С уважением, Дер Кинг


person Der King    schedule 30.09.2017    source источник
comment
Если вы переместите свой try/catch внутрь foreach.... next, когда вы получите исключение, вы можете продолжить следующую итерацию.   -  person Steve    schedule 01.10.2017
comment
Спасибо, теперь он продолжает цикл. Но теперь иконки не на своих местах. Я думаю, что это происходит, когда сервер недоступен, он получает значок со следующего рабочего сервера.   -  person Der King    schedule 01.10.2017


Ответы (1)


Сначала переместите try catch внутрь цикла

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

Это позволит вашему коду продолжить работу внутри цикла foreach, когда он столкнется с исключением при получении favicon.ico.

Следующая проблема заключается в том, как вы обращаетесь к изображениям в списке изображений. Когда вы сталкиваетесь с исключением из-за того, что ваш код не может получить значок значка, вы ничего не добавляете в ImageList.
На этом этапе ваши ImageList и ваши ListView.Items не содержат одинаковое количество элементов, поэтому вы не можете использовать myItem.Index для ссылки на изображение в ImageList.

Но поскольку изображение было только что добавлено в ImageList в предыдущей строке, вы уверены, что требуемое изображение является последним элементом ImageList. Таким образом, вы можете использовать свойство ImageList.Images.Count (меньше 1)

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

(Обратите внимание, что в этом контексте вы можете напрямую использовать myItem)

person Steve    schedule 30.09.2017
comment
Большое спасибо. Оно работает. Плохо сказать, что скорость действительно низкая. Просмотр списка с примерно 120 записями занимает до 4 минут, чтобы загрузить значки. Но я думаю, что это проблема веб-запроса и исключений. - person Der King; 01.10.2017
comment
Да, исключениям требуется много времени для обработки всей необходимой информации (трассировка стека и т. д.). - person Steve; 01.10.2017