2012-06-28 65 views
0

我有一个简单的程序,检查网页字符串,例如: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 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 

它工作正常,但速度很慢,因为它会检查一次在一个网页。

我意识到我可以在button1_click子文件中使用parallel.for,但是我担心它可能会产生大量线程并使web连接过载。

我宁愿可以设置它使用的线程的具体金额,但林不知道从哪里开始。例如,我将如何分配每个网址线程等

回答

2

那么你当然可以使用Parallel.ForEach并指定最大并行化程度使用this overload,您可以指定一个ParallelOptions

请注意,您不应在点击处理程序做到这一点,但 - 你的UI将阻塞,直到这一切都结束了。要么你想在一个新的线程执行Parallel.ForEach,或(使用Task.Factory.StartNew)开始新任务,依靠内的并行限制。 (或创建为目的的自定义任务工厂。有TPL的文档中周围的文档,我相信。)

同样的方法CheckForLinks必须尝试更新非UI线程中的UI。对于的WinForms,你可以使用Control.Invoke要回UI线程 - 或者,如果你使用的任务,你可以添加一个延续(Task.ContinueWith)和指定任务调度器绑在UI同步上下文。

坦率地说,在控制台应用程序做,这将是显著简单 - 只需使用Parallel.ForEach,你会被罚款:)

+0

大,非常感谢。应该看看过载。是的,一个控制台应用程序是这样做的方式,要简单得多。 – Steve

+0

@ user574632嗨,先生,我正在寻找和你所做的完全一样的东西。我已经在单线程的过程中取得了成功。我想用多线程来制作它。如果你能指导我做同样的事情,我将非常感激:)非常感谢。 –