.net多线程webclient.DownloadString,还是使用DownloadStringAsync?

时间:2012-08-23 18:40:30

标签: .net vb.net webclient

我正在尝试了解加速一个程序的最佳方法,该程序在多个网站的源代码中搜索字符串。目前的计划如下:

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

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我会将评论作为答案发布,因为这并没有带来太大的流量。

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

一个简单的开始是WithDegreeOfParallelism来节流。 enter link description here

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

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