【发布时间】:2010-09-23 13:26:59
【问题描述】:
我正在开发一种抓取器,它可以抓取一个网页的链接,然后创建执行线程 子页面的抓取。
这是线程的作用:
Dim client As New WebClient()
Dim stream As Stream = client.OpenRead(_Address)
Dim streamReader As New StreamReader(stream, True)
_Content = streamReader.ReadToEnd()
streamReader.Close()
streamReader.Dispose()
stream.Close()
stream.Dispose()
client.Dispose()
我注意到有时(通常当有更多同时运行的线程时)线程会引发异常。它是随机发生的,异常在client.OpenRead 处抛出,它说"Value cannot be null. Parameter name: address"。我这里也有一个 try..catch,所以我在 catch 块中放置了一个断点,看起来 _Address 在当时是有效的,但代码会引发异常。
_Address 是受保护的类字段,其他线程无法访问。
确切的信息是:
“值不能为空。参数名称:地址”。
例外是System.ArgumentNullException。
堆栈跟踪是:
在 MyAppFolder\Scraper.vb:line 96 中的 MyAppName.Scraper.Scrape() 处的 System.Net.WebClient.OpenRead(String address)
您对解决此问题有什么建议吗? 提前谢谢你。
【问题讨论】:
-
您是否在静态(模块/共享)类/方法中使用此代码?
-
发布错误消息和堆栈跟踪将是一个好主意。既然是关于_Address,它是从哪里形成的?
-
@Oded 不,公共类的方法内的代码。
-
@Henk Holterman 确切的消息是“值不能为空。参数名称:地址”。例外是 System.ArgumentNullException。堆栈跟踪是:“在 MyAppFolder\Scraper.vb:line 96 中 MyAppName.Scraper.Scrape() 处的 System.Net.WebClient.OpenRead(String address)”
-
@Witchunter - 请编辑您的问题并在问题中添加堆栈跟踪和其他信息。在 cmets 中,它可能会被掩盖,而且肯定更难阅读。
标签: .net vb.net exception webclient