Vb.net 存在问题的多线程代理检查器

Vb.net 存在问题的多线程代理检查器,vb.net,multithreading,visual-studio-2010,Vb.net,Multithreading,Visual Studio 2010,我正在尝试创建代理检查器。 这是我第一次尝试多线程,但进展不太顺利,线程似乎在等待一个线程完成,然后再初始化下一个线程 Imports System.Net Imports System.IO Imports System.Threading Public Class Form1 Public sFileName As String Public srFileReader As System.IO.StreamReader Public sInputLine As St

我正在尝试创建代理检查器。
这是我第一次尝试多线程,但进展不太顺利,线程似乎在等待一个线程完成,然后再初始化下一个线程

Imports System.Net
Imports System.IO
Imports System.Threading

Public Class Form1
    Public sFileName As String
    Public srFileReader As System.IO.StreamReader
    Public sInputLine As String

    Public Class WebCall
        Public proxy As String
        Public htmlout As String

        Public Sub New(ByVal proxy As String)
            Me.proxy = proxy
        End Sub

        Public Event ThreadComplete(ByVal htmlout As String)

        Public Sub send()
            Dim myWebRequest As HttpWebRequest = CType(WebRequest.Create("http://www.myserver.com/ip.php"), HttpWebRequest)
            myWebRequest.Proxy = New WebProxy(proxy, False)
            Try
                Dim myWebResponse As HttpWebResponse = CType(myWebRequest.GetResponse(), HttpWebResponse)
                Dim loResponseStream As StreamReader = New StreamReader(myWebResponse.GetResponseStream())
                htmlout = loResponseStream.ReadToEnd()
                Debug.WriteLine("Finished - " & htmlout)
                RaiseEvent ThreadComplete(htmlout)
            Catch ex As WebException
                If (ex.Status = WebExceptionStatus.ConnectFailure) Then
                End If
                Debug.WriteLine("Failed - " & proxy)
            End Try
        End Sub
    End Class

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim proxy As String
        Dim webArray As New ArrayList()
        Dim n As Integer
        For n = 0 To 2
            proxy = srFileReader.ReadLine()
            webArray.Add(New WebCall(proxy))
        Next

        Dim w As WebCall
        For Each w In webArray
            Threading.ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf w.send), w)
        Next w

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        srFileReader = System.IO.File.OpenText("proxies.txt")
    End Sub
End Class

我将把这作为回答,而不是评论:


线程似乎在等待一个线程完成,然后再初始化下一个线程

这就是它听起来的样子:一小群线程。出于我们的目的,让我们假设这个池有10个线程。如果将1000个任务排队,则前10个任务将在10个可用线程中执行,而其他任务将排队等待任务完成

HTTP调用速度很慢,它会占用一个线程直到它完成。可以理解,启动大量长时间运行的任务会很快使线程池中的所有可用线程立即枯竭,而剩余的任务会排队等待,直到另一个线程可用为止。换句话说,您看到的是线程池的预期行为

不管它值多少钱,您都可以使用和事件进行HTTP调用,而不阻塞当前线程,因此将其释放回线程池供其他任务使用

I was under the assumption that the threads can run simultaneously "side-by-side"
线程确实并行运行,但实际上不会同时运行1000个线程。线程有巨大的开销,因为每个线程都有自己的堆栈,默认情况下,堆栈大小约为

由于创建线程非常昂贵,.NET会预先分配一些线程并将它们放入线程池。(默认线程数取决于虚拟地址空间的大小、CPU内核的数量等)任务在线程池线程上执行,一旦完成,线程将返回到线程池,以便可以被另一个任务重用——这比为每个任务创建新线程要好

那么我需要设置 线程,带有 setminthreads/maxthreads

不可以。不要摆弄SetMinThreads/SetMaxThreads方法——线程池已经进行了高度优化,可以在需要时向池中添加更多线程。除非您是CLR处理线程方式的专家,否则很有可能弄乱ADPool会导致性能下降


您可能会发现这很有用:

为什么不尝试开发一个web或?如今,使用AJAX非常简单,您不需要担心或管理线程,它是通过异步JavaScript在浏览器和服务器之间自动完成的。

“线程似乎在等待一个线程完成,然后再初始化下一个。”只是想知道,但预期的行为是什么?线程池就是它听起来的样子:一个线程池(假设这个池有10个线程),并不是所有的线程都将同时运行(即,您将1000个任务排队,但池中只有10个线程,因此在任何给定的时间只有10个线程在运行,其他请求将在队列中等待线程释放). 请参阅msdn:我假设线程可以“并排”同时运行,那么我是否需要使用setminthreads/maxthreads设置线程数?谢谢你的回复