【问题标题】:Backgroundworker doesn't work... VB.NetBackgroundworker 不起作用... VB.Net
【发布时间】:2011-08-22 04:20:48
【问题描述】:

这是我的代码:

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    For i = 0 To 1000
        Dim inum As String = i & "0"


        Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://www.google.nl/search?q=site:" & combobox1.Text & "&hl=nl&start=" & inum)
        Dim response As System.Net.HttpWebResponse = request.GetResponse

        Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

        Dim sourcecode As String = sr.ReadToEnd
        Dim search As String = combobox1.Text
        Dim r As New System.Text.RegularExpressions.Regex("http://" & search & "/\w*")
        Dim matches As MatchCollection = r.Matches(sourcecode)


        For Each itemcode As Match In matches

            Dim item As String = (itemcode.ToString.Split("""").GetValue(0))
            Dim url As New Net.WebClient
            Dim str As String = url.DownloadString("http://www.prcheck.nl/results.php?url=" & item)

            If str.Contains(">0/10") Then
                ListBox1.Items.Add("(0/10) " & item)
            ElseIf str.Contains("1/10") Then
                ListBox1.Items.Add("(1/10) " & item)
            ElseIf str.Contains("2/10") Then
                ListBox1.Items.Add("(2/10) " & item)
            ElseIf str.Contains("3/10") Then
                ListBox1.Items.Add("(3/10) " & item)
            ElseIf str.Contains("4/10") Then
                ListBox1.Items.Add("(4/10) " & item)
            ElseIf str.Contains("5/10") Then
                ListBox1.Items.Add("(5/10) " & item)
            ElseIf str.Contains("6/10") Then
                ListBox1.Items.Add("(6/10) " & item)
            ElseIf str.Contains("7/10") Then
                ListBox1.Items.Add("(7/10) " & item)
            ElseIf str.Contains("8/10") Then
                ListBox1.Items.Add("(8/10) " & item)
            ElseIf str.Contains("9/10") Then
                ListBox1.Items.Add("(9/10) " & item)
            ElseIf str.Contains("10/10") Then
                ListBox1.Items.Add("(10/10) " & item)
            Else
                ListBox1.Items.Add("(0/10) " & item)

            End If

            Label2.Text = ListBox1.Items.Count
        Next



        If Not sourcecode.Contains("<b>Volgende</b>") Then
            MsgBox("")
            Exit For
        End If
    Next
End Sub

和 combobox1.text = www.google.nl(示例)

按钮 1 处的代码是:

BackgroundWorker1.RunWorkerAsync()

如果后台工作程序完成:

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MsgBox("Done")
End Sub

如果我点击按钮 1,我会在半秒内收到消息:完成

代码有什么问题??

如果我将代码放在 backgroundworker1 中,只是在 button1 中,它可以工作,但速度很慢..

【问题讨论】:

  • Debug + Exceptions,勾选抛出的 CLR 异常框。请务必阅读 MSDN Library 文档,了解您可以在 DoWork 中做什么。更新 ListBox 不是其中之一。
  • 如果我使用 try catch ex 作为异常 msgbox(ex...) end try 我没有收到错误。你能告诉我在哪里可以打勾吗?
  • 我在进度中完成了这段代码:如果 e.error 不是空的,那么 msgbox 就会出现错误。好吧,我收到了这个错误:错误:跨线程操作无效:控件'combobox1'从创建它的线程以外的线程访问。

标签: vb.net backgroundworker


【解决方案1】:

您只能从主应用程序线程中更新 UI,在这种情况下,您尝试通过由后台工作人员创建的后台线程进行更新,这将引发您发现的异常。

您需要执行的操作是运行添加到主线程上的 ListBox 的代码,您可以通过 BeginInvoke 和一个将您要添加的项目作为参数的自定义委托来执行此操作,委托可以然后将项目添加到列表框 - BeginInvoke 的文档中有一个如何执行此操作的示例。

【讨论】:

  • 但是我不明白,错误与列表框无关吗?错误是针对组合框...
【解决方案2】:

我会返回要从后台工作人员添加的项目列表或数组,然后在 RunWorkerCompleted 事件处理程序中填充 ListBox。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2023-03-22
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多