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 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 为每个循环线程化初始值。除了一些避免跨线程问题和阻塞 GUI 的编辑之外,这似乎很简单,但似乎不是最好的方法。

使用 webclient.DownloadStringAsync 方法。这是我看到的第一件事,但我不知道如何从 DownloadStringCompleted 事件传回结果字符串。另外,如果我能解决这个问题,你如何限制同时发出的请求数量,以避免网络连接过载?

我还查看了一些使用 .net4.5 的 c# 示例,它们看起来很棒,但是该程序需要在 server2003 上运行,所以我想那是不可能的

非常感谢任何帮助。

4

1 回答 1

0

我将发表评论作为答案,因为这并没有获得太多流量。

TPL 根据 CPU 分配线程,它不会处理不会很好地增加 CPU 负载的慢速连接。

一个简单的开始是 WithDegreeOfParallelism 来节流。在此处输入链接描述

您可能会发现 100 是一个很好的 WithDegreeOfParallelism。

下一级优化变得更加复杂。如果是异步,线程池,或者组合。这将在很大程度上取决于网站的延迟。而且我不确定您是否会购买很多异步线程,因为空闲线程的开销并不大。

于 2012-08-25T00:28:11.943 回答