I have a Private Sub Fill(), which im trying to call from button1, in the form of
Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill)
t1.Start()
However, when I run the program nothing happens. I click the button numerous times and the function isnt being executed. What gives? The Fill function is basically a outputting bunch of html from IE into a textbox, running regex and outputting the results in a listbox.
Can anyone help me get this working? I'd appreciate the help. EDIT: Below, is the Fill function that I am trying to get working. The function itself works, when i try it without multithreading. But not with it...
Private Sub Fill()
Try
For Each links In ListBox2.Items
Dim blah As Boolean = False
Do While blah = False
Application.DoEvents()
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
blah = True
WebBrowser1.Navigate(links)
Application.DoEvents()
Me.Refresh()
'OUTPUT THE REGEX IN RTB
Try
RichTextBox1.Text = WebBrowser1.Document.Body.OuterHtml
RichTextBox1.Update()
Application.DoEvents()
Me.Refresh()
'INTRODUCE REGEX
开发者_开发技巧 If CheckBox1.Checked = True Then
Dim R As New Regex("</H3><.*gt;")
For Each M As Match In R.Matches(RichTextBox1.Text)
Dim email As String = M.Value.Substring(9).Split("&;").GetValue(0).ToString
ListBox1.Items.Add(email)
Next
End If
Catch ex As Exception
Label1.Text = "Error recieved. Program will not stop"
Me.Refresh()
End Try
Application.DoEvents()
Me.Refresh()
End If
Loop
Next
Catch ex As Exception
End Try
End Sub
I think you are having problems because you are not on the UI thread when you are trying to write to the textbox in the Fill() method – this will causes an exception. To solve the problem you need to switch to the UI thread using BeginInvoke and a delegate as in the example below:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill)
t1.Start()
End Sub
Private Delegate Sub FillDelegate()
Private Sub Fill()
If TextBox1.InvokeRequired Then
TextBox1.BeginInvoke(New FillDelegate(AddressOf Fill))
Else
TextBox1.Text = "Worked!!!!"
End If
End Sub
Start by placing a breakpoint inside the Fill method. I bet it starts up just fine.
Make sure your Button handler still has Handles Button1.Click
on the end of it. Sometimes people cut and paste the Button to somewhere else on their form and this causes the IDE to un-wire it and leave the handler "orphaned".
精彩评论