0

複数の Web サイトのソースで文字列を検索する小さなプログラムを高速化するための最良の方法を理解しようとしています。現状のプログラムは以下の通りです。

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

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

End Sub

使用可能なオプションは次のとおりです。 parallel.for each を使用して、最初の for each ループをスレッド化します。クロススレッドの問題と GUI のブロックを回避するためのいくつかの編集を除けば、実行するのは非常に簡単に思えますが、それを実行する最善の方法とは思えません。

webclient.DownloadStringAsync メソッドを使用します。これは私が最初に見たものですが、 DownloadStringCompleted イベントから結果の文字列を返す方法がわかりません。また、これを解決できる場合、ネットワーク接続の過負荷を避けるために、同時リクエストの数をどのように制限しますか?

また、見栄えの良い.net4.5を使用したC#の例もいくつか見ましたが、プログラムはserver2003で実行する必要があるため、それは問題外だと思います

どんな助けでも大歓迎です。

4

1 に答える 1

0

これはあまりトラフィックが得られないため、コメントを回答として投稿します。

TPL は CPU に基づいてスレッドを割り当てますが、CPU に負荷をかけない低速の接続は処理しません。

簡単な開始は、スロットルへの WithDegreeOfParallelism です。ここにリンクの説明を入力

100 が適切な WithDegreeOfParallelism であることがわかる場合があります。

次のレベルの最適化は、さらに複雑になります。非同期、スレッド プール、または組み合わせの場合。ウェブサイトのレイテンシーに大きく依存します。また、アイドルスレッドはそれほどオーバーヘッドではないため、非同期で多く購入するかどうかはわかりません。

于 2012-08-25T00:28:11.943 に答える