【问题标题】:VB.NET Background Worker check propriety of the form TargetInvocationExceptionVB.NET 后台工作人员检查 TargetInvocationException 形式的适当性
【发布时间】: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


    【解决方案1】:

    我一个人做的,问题是我在运行时创建了组件,所以我应该为组件创建句柄,创建组件后做这样的事情就足够了:

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

    变量句柄没用,但是调用组件的句柄属性会强制组件创建句柄,这就是我做这个赋值的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2011-01-13
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多