0

I have a simple program that checks webpages for strings, example:

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

It works fine, but is slow, as it checks one webpage at a time.

I realize i can use a parallel.for each in the button1_click sub, but im worried that it might generate a ton of threads and overload the web connection.

I would prefer to be able to set the exact amount of threads it uses, but im not sure where to start. Eg how would i assign each url to a thread etc.

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 に答える