【发布时间】:2015-06-19 01:44:55
【问题描述】:
我正在开发一个程序,该程序应该从网站上找到一些图像的 url 并应该下载它们,我已经编写了解析代码和下载代码,它可以工作,但是因为我注意到它真的很慢,所以我认为它如果我让它与表单异步工作会更好,所以我创建了 2 个后台工作人员:
1) 解析器
2) 下载器
当解析器启动时,下载器也启动,解析器应该将 url 添加到列表框,下载器应该下载它们并从列表中删除,我认为管理它不会有问题,我真正的问题是...我从未使用过后台工作人员...
解析器应该在 Webbrowser 中加载页面,而不是解析图像,但是当我在 webbrowser 上调用函数时导航...它停止给我一个 TargetInvocationException。
我在网上搜索,据我所见,后台工作人员似乎无法直接访问 GUI 控件的属性和方法,据我所知,它应该使用 Invoke,所以我创建了一个函数来完成所有工作,它会检查浏览器是否在另一个线程中,或者通过这样做来检查浏览器是否在这个线程中:
Sub parse(ByVal url As String)
If wb.InvokeRequired Then 'wb is the Webbrowser
wb.Invoke(New Action(AddressOf prova))
Return
End If
'Navigate to the url, wait for browser to complete loading then do the parsing
End Sub
现在我的问题有两个:
1) 即使我从工作人员调用方法,invokerequired 的属性值为 false,因此不会调用调用,它仍然给我同样的异常
2) 如果我调用 invoke 我应该强制该方法在 GUI 线程中运行,对吗? 如果是这样......它不应该像以前一样减慢我的程序吗?
【问题讨论】:
标签: vb.net multithreading backgroundworker