2010-01-11 85 views
0

我有一个私人小组填写(),其即时通讯试图从Button1的调用,在VB.net简单的多线程

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

t1.Start() 

但是形式,当我运行的程序没有任何反应。我多次单击该按钮并且该功能未被执行。是什么赋予了? Fill函数基本上是从IE输出一串html到文本框中,运行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 
+1

您是否知道GUI线程/工作线程编组要求? – 2010-01-11 04:20:34

+0

这是VB.Net中多线程的一个小教程: http://chrishaas.wordpress.com/2009/06/25/creating-a-simple-multi-threaded-vb-net-application/ – 2010-01-11 15:14:22

回答

0

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

+0

当我通过注释多线程代码来调用Fill方法,并且只需填充Fill(),它就可以工作。这就是为什么我很困惑,为什么它不适用于MT ... – Rudy 2010-01-11 06:06:51

3

我认为你有问题,因为当你试图写入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 
+0

+1 rip是正确的,用户界面是在另一个线程。 – Walter 2010-01-11 13:50:58

+0

但是OP在抱怨填充功能从未开始,并不是没有按照要求做。 – AngryHacker 2010-01-11 16:41:04

+0

不抱怨异常。可能使用Form1.TextBox1.Text。这不起作用,Form1会创建一个新表单。一个看不见的。 – 2010-01-11 21:08:51

-1

确保您的按钮处理程序仍然有Handles Button1.Click在它的结束。有时候人们会将Button剪切并粘贴到其他窗体上的其他位置,这会导致IDE将它断开并使处理程序“孤立”。