Фоновая работа не работает ... VB.Net - PullRequest
2 голосов
/ 21 августа 2011

это мой код:

    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, он работает, но идет очень медленно ..

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Вы можете обновлять пользовательский интерфейс только из основного потока приложения, в этом случае вы пытаетесь сделать это через фоновый поток, созданный фоновым рабочим, который выдает исключение, как вы обнаружили.

Что вам нужно сделать, это запустить код, который добавляет в ListBox в главном потоке, что вы можете сделать через BeginInvoke , и пользовательский делегат, который принимает элемент, который вы хотите добавить какПосле этого делегат может добавить элемент в список - пример того, как это сделать, в документации для BeginInvoke.

0 голосов
/ 22 августа 2011

Я бы вернул список или массив элементов, которые нужно добавить из фонового работника, а затем заполнил бы ListBox в обработчике событий RunWorkerCompleted.

...