VB.net简单多线程

VB.net简单多线程,vb.net,multithreading,Vb.net,Multithreading,我有一个私有的Sub-Fill(),我试图从button1调用它,形式为 Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill) t1.Start() 但是,当我运行程序时,什么也没有发生。我多次单击该按钮,但该功能未执行。有什么好处?Fill函数基本上是将一堆html从IE输出到一个文本框中,运行regex并将结果输出到一个列表框中 有人能帮我把这个弄好吗?我很感激你的帮助。 编辑

我有一个私有的Sub-Fill(),我试图从button1调用它,形式为

Dim t1 As System.Threading.Thread = New System.Threading.Thread(AddressOf Me.Fill)

t1.Start()
但是,当我运行程序时,什么也没有发生。我多次单击该按钮,但该功能未执行。有什么好处?Fill函数基本上是将一堆html从IE输出到一个文本框中,运行regex并将结果输出到一个列表框中

有人能帮我把这个弄好吗?我很感激你的帮助。 编辑:下面是我正在尝试使用的填充函数。当我在不使用多线程的情况下尝试时,函数本身可以工作。但不是用它

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
专用子填充()
尝试
对于ListBox2.Items中的每个链接
将blah变暗为布尔值=False
当废话=假的时候做
Application.DoEvents()
如果WebBrowser1.ReadyState=WebBrowserReadyState.Complete,则
胡说八道
WebBrowser1.导航(链接)
Application.DoEvents()
我
'在RTB中输出正则表达式
尝试
RichTextBox1.Text=WebBrowser1.Document.Body.OuterHtml
RichTextBox1.Update()
Application.DoEvents()
我
“介绍正则表达式
如果CheckBox1.Checked=True,则
Dim R作为新的正则表达式(“%gt;”)
对于R.Matches中的每个M As匹配(RichTextBox1.Text)
Dim email As String=M.Value.Substring(9).Split(&;“”).GetValue(0).ToString
ListBox1.Items.Add(电子邮件)
下一个
如果结束
特例
Label1.Text=“收到错误。程序不会停止”
我
结束尝试
Application.DoEvents()
我
如果结束
环
下一个
特例
结束尝试
端接头

首先在Fill方法中放置一个断点。我敢打赌,它启动得很好。

我认为您遇到了问题,因为当您尝试在Fill()方法中写入文本框时,您不在UI线程上–这将导致异常。要解决此问题,您需要使用BeginInvoke和委托切换到UI线程,如下例所示:

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

确保您的按钮处理程序仍有
句柄按钮1。单击按钮末尾的
。有时,人们会将按钮剪切并粘贴到表单上的其他位置,这会导致IDE取消连接,使处理程序处于“孤立”状态。

您是否了解GUI线程/工作线程编组要求?下面是一个关于VB.Net中多线程的小教程:当我调用Fill方法时,通过注释多线程代码,只需放入Fill()即可。这就是为什么我对它为什么不能与MT一起工作感到困惑的原因。但是OP抱怨填充函数永远不会启动,不是说它没有完成所需的操作。也不是抱怨异常。可能使用Form1.TextBox1.Text。这不起作用,Form1创建了一个新表单。一个看不见的。是的,nobugz是对的。我没有得到任何例外,或其他任何东西。我只是点击按钮,什么也没发生。我在最初的帖子中包含了Fill()函数。请看一看,并提供任何建议,让它与多线程工作。谢谢,谢谢你的努力。我刚刚将你的Fill()方法插入我的模型,效果很好!下面是我要做的一些事情来确定这一点:注释Fill()中的所有代码。Fill()是否从多线程调用中调用?如果不是,那么问题在于Fill()代码。因此,我将尝试通过取消注释每行代码和测试来确定问题代码行。如果确实调用了Fill(),那么表单上一定有其他内容在妨碍它。我将剥离表单以确定这一点–删除Fill()中不需要的控件和代码。