开发者

VB.net Simple Multithreading

开发者 https://www.devze.com 2022-12-16 03:53 出处:网络
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)

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>&lt;.*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".

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号