0

何百ものWebサイトのhtmlを収集するHttpWebRequestを含むVBコードがありますが、タスクを完了するのに非常に長い時間がかかります。コードは基本的にfor-to-loopであり、リストボックス内の各Webサイトのhtmlを読み取ります。ループでは、各Webサイトの抽出されたhtmlで特定の単語が検索されます。各単語列の下に単語があるウェブサイトのリストを表示したい。

 For Each webAddr As String In lstbox.Items

        strHtml = Make_A_Call(webAddr)

        If strHtml.Contains("Keyword1") Then
            ..........
        End If
        If strHtml.Contains("Keyword2") Then
             ..........
        End If
        ..........
        ..........
        ..........
        ..........
        ..........
    Next

Private Function Make_A_Call(ByVal strURL As String) As String
    Dim strResult As String
    Dim wbrq As HttpWebRequest
    Dim wbrs As HttpWebResponse
    Dim sr As StreamReader

    Try
        strResult = ""
        wbrq = WebRequest.Create(strURL)
        wbrq.Method = "GET"
        ' Read the returned data   
        wbrs = wbrq.GetResponse
        sr = New StreamReader(wbrs.GetResponseStream)
        strResult = sr.ReadToEnd.Trim
        sr.Close()
        sr.Dispose()
        wbrs.Close()
    Catch ex As Exception
        ErrMessage.Text = ex.Message.ToString
        ErrMessage.ForeColor = Color.Red
    End Try
    Return strResult
End Function

コンパイルされたコードは、ループを完了するのにほぼ5分かかります。完了しない場合があります。パフォーマンスを向上させるために変更できますか?より良いコードと提案を手伝ってください。

4

1 に答える 1

0

2つの別々のボトルネックがあることを忘れないでください。

  • HTMLをダウンロードするための帯域幅
  • CPU処理

並列処理を使用してダウンロードを必ずしも高速化できるとは限りません。それは、より多くの帯域幅を購入することによってのみ助けることができます。ただし、できることは、ダウンロードと処理が別々のスレッドで行われるようにすることです。次のことをお勧めします。

  • BackgroundWorkerインスタンスを使用してデータをダウンロードします。
  • 作業完了コールバックでは、最初に次のバックグラウンドワーカーを起動し、次に既存のワーカーの結果を処理します(キーワード検索)。
于 2012-09-12T18:20:04.703 に答える