2010-01-11 78 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將它斷開並使處理程序「孤立」。