VB.NET后台工作者检查形式TargetInvocationException

时间:2015-06-18 08:14:09

标签: vb.net multithreading backgroundworker

我正在开发一个程序,应该从网站上找到一些图片的网址,并且应该下载它们,我已经编写了解析代码和下载代码,并且它可以工作,但是因为我发现它真的很慢我认为它如果我让它从表单中工作异步会更好,所以我创建了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)即使我从worker调用方法,invoke需要的propriety值也是false,所以调用没有被调用,它仍然给我相同的异常

2)如果我调用invoke,我应该强制该方法在GUI线程中运行,对吧? 如果是这样......不应该像以前一样减慢我的程序吗?

1 个答案:

答案 0 :(得分:0)

我单独做了,问题是我在运行时创建了组件,所以我应该为组件创建句柄,在创建组件之后就足够了这样做:

If Not wb.IsHandleCreated Then
  Dim handle As IntPtr = wb.Handle
End If

变量句柄是无用的,但是调用组件的句柄属性会强制组件创建句柄,这就是我做出这个任务的原因。