WebException - 阻塞每个循环

Posted

技术标签:

【中文标题】WebException - 阻塞每个循环【英文标题】:WebException - Blocking For Each Loop 【发布时间】:2017-09-30 21:39:31 【问题描述】:

几个月以来我一直在学习编码。 今天我想编写一个密码管理器。一切正常,但如果主机无法访问,则获取图标功能会出现问题。该功能是从网页中获取favicon。

           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

一些服务器以异常响应:

无法解析远程主机

。 当这种情况发生时,每个循环的整体都会停止。我正在寻找一种方法来忽略该错误并继续列表视图中的下一项。

任何人都可以给我提示或解决方案。

最好的问候, 大王

【问题讨论】:

如果您将 try/catch 移动到 foreach 中......接下来,当您遇到异常时,您可以继续下一次迭代。 谢谢,现在它继续循环。但是现在图标不在正确的位置。我认为当服务器无法访问他从下一个工作服务器获取图标时会发生这种情况。 【参考方案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

这将允许您的代码在检索 favicon.ico 时遇到异常时在 foreach 循环中继续运行

下一个问题是如何处理图像列表中的图像。当您因为代码无法检索网站图标而遇到异常时,您无需向 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)

【讨论】:

非常感谢。有用。不好说速度真的很慢。包含大约 120 个条目的列表视图最多需要 4 分钟来加载图标。但我认为这就是 webrequest 和异常的问题。 是的,异常需要很长时间来处理所有需要的信息(堆栈跟踪等)。

以上是关于WebException - 阻塞每个循环的主要内容,如果未能解决你的问题,请参考以下文章

GetResponse() 和 WebException 杀死我的线程

System.Net.WebException:无法解析远程名称:

在插槽中调用 QDialog::exec 会阻塞主事件循环吗?

async/await 会阻塞事件循环吗? [复制]

循环填充数组时的 Swift EXC_BAD_INSTRUCTION

读取 WebException 的响应流时出现 WebException