0

我有一个简单的程序来检查网页的字符串,例如:

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 each,但我担心它可能会生成大量线程并使 Web 连接过载。

我希望能够设置它使用的确切线程数,但我不确定从哪里开始。例如,我如何将每个 url 分配给线程等。

4

1 回答 1

2

好吧,您当然可以使用此重载Parallel.ForEach并指定最大并行化程度,您可以在其中指定.ParallelOptions

请注意,您不应该在您的点击处理程序中执行此操作 - 您的 UI 将阻塞,直到它全部完成。您要么想Parallel.ForEach在新线程中执行,要么开始新任务(使用Task.Factory.StartNew)并依赖其中的并行度限制。(或者为此目的创建一个自定义任务工厂。我相信 TPL 文档中有相关文档。)

同样,您的CheckForLinks方法不得尝试在非 UI 线程中更新 UI。对于 WinForms,您可以使用Control.Invoke返回到 UI 线程 - 或者如果您正在使用任务,您可以添加一个延续 ( Task.ContinueWith) 并指定一个绑定到 UI 同步上下文的任务调度程序。

坦率地说,在控制台应用程序中执行此操作会简单得多 - 只需使用就Parallel.ForEach可以了 :)

于 2012-06-28T18:54:36.400 回答