2012-06-28 103 views
0

我有一個簡單的程序,檢查網頁字符串,例如:VB.net多線程一個WebClient的循環

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim urls() As String = TextBox1.Lines() 
    Dim links() As String = TextBox2.Lines() 
    For Each url As String In urls 
     CheckForLinks(url, links) 
    Next 

End Sub 
Private Sub CheckForLinks(ByVal url As String, ByVal links() As String) 
    Dim wc As New WebClient() 
    Dim source As String = wc.DownloadString(url) 
    'MessageBox.Show(source) 
    For Each link As String In links 
     If (source.IndexOf(link) <> -1) Then 
      TextBox3.AppendText("url: " + url + " link: " + link + vbCrLf) 
      Exit For 
     Else 
      TextBox3.AppendText("url: " + url + " link: " + "NOT FOUND" + vbCrLf) 
     End If 
    Next 

End Sub 

它工作正常,但速度很慢,因爲它會檢查一次在一個網頁。

我意識到我可以在button1_click子文件中使用parallel.for,但是我擔心它可能會產生大量線程並使web連接過載。

我寧願可以設置它使用的線程的具體金額,但林不知道從哪裏開始。例如,我將如何分配每個網址線程等

回答

2

那麼你當然可以使用Parallel.ForEach並指定最大並行化程度使用this overload,您可以指定一個ParallelOptions

請注意,您不應在點擊處理程序做到這一點,但 - 你的UI將阻塞,直到這一切都結束了。要麼你想在一個新的線程執行Parallel.ForEach,或(使用Task.Factory.StartNew)開始新任務,依靠內的並行限制。 (或創建爲目的的自定義任務工廠。有TPL的文檔中周圍的文檔,我相信。)

同樣的方法CheckForLinks必須嘗試更新非UI線程中的UI。對於的WinForms,你可以使用Control.Invoke要回UI線程 - 或者,如果你使用的任務,你可以添加一個延續(Task.ContinueWith)和指定任務調度器綁在UI同步上下文。

坦率地說,在控制檯應用程序做,這將是顯著簡單 - 只需使用Parallel.ForEach,你會被罰款:)

+0

大,非常感謝。應該看看過載。是的,一個控制檯應用程序是這樣做的方式,要簡單得多。 – Steve

+0

@ user574632嗨,先生,我正在尋找和你所做的完全一樣的東西。我已經在單線程的過程中取得了成功。我想用多線程來製作它。如果你能指導我做同樣的事情,我將非常感激:)非常感謝。 –