【问题标题】:Threadpool using upto 200 threads使用多达 200 个线程的线程池
【发布时间】:2011-09-23 02:32:40
【问题描述】:

我有这段代码,我运行队列为 10,000,即使设置了最大值 50 但线程池计数变高。

谁能帮我找出错误

Public Sub DoWork(ByVal objItem As Object)
        Dim objUrl as String = DirectCast(objItem, string)
        Try
            If objUrl Is Nothing Then
                exit sub
            End If

            Dim URL as New Uri(objUrl)

            AddItem(URL.AbsoluteUri,gethtml(URL))

        Catch ex As Exception
            debug.Print("Error " & ex.StackTrace )
        End Try

    End Sub

    Private Sub btnStart_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnStart.Click
        btnStart.Enabled =False
        ThreadPool.SetMaxThreads(50, 50)
        System.Threading.Thread.Sleep(1000)
        listView1.Items.Clear

        For Each sItem As String In txturls.Lines
            if sItem.Trim <>string.empty

                If sItem.Contains("http://")=False Then
                    sItem="http://" & sItem
                End If

                ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf DoWork), sItem)
                TotalItems+=1
                tsslTotal.Text =String.Format ("Total Tasks: {0}",TotalItems)

            end if
        Next

    End Sub

谢谢

编辑

对于那些询问的人,

GetHtml 从网上获取网页源

AddItem 将 GetHtml 的结果添加到 Listview

再次感谢您的关注

编辑

我使用此代码检查每秒运行的线程数

Sub Timer1Tick(sender As Object, e As EventArgs)
        tsslthreads.Text=string.Format ("Threads: {0}", Process.GetCurrentProcess().Threads.Count)
    End Sub

谢谢

【问题讨论】:

  • “gethtml”是做什么的?这些可能是本机线程,不由 TP 管理。
  • 我的帖子更新了,请查收

标签: .net vb.net winforms threadpool


【解决方案1】:

刚刚写了一个小演示项目。试试这段代码来检查 available 线程,你会看到只有 50 个线程 RUNNING。比较:您的代码将排队 10000 个线程

private void timer1_Tick(object sender, EventArgs e)
    {
        int workerThreads = 0;
        int completionPortThreads = 0;
        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);

        lblTotal.Text = string.Format("Worker {0}/Completion {1}", workerThreads, completionPortThreads);
    }

我的代码在 c# 中,我添加了一个计时器来显示线程数..

【讨论】:

  • 我有 10,000 个排队的任务,不是线程破坏,而是 200 多个线程在运行
  • currentProcess中的线程数和线程池中的线程数不一样。您是否使用我的代码检查了 threadPool 中可用进程的数量?我的来源的结果是什么?
  • 当我第一次启动应用程序而不开始任何工作时,它显示Worker 250/Completion 1000
  • 好的 - 单击开始按钮后,计数器从哪个值开始?它应该是 50 并且计数为零......如果是这样 - 一切都很好
【解决方案2】:

究竟出了什么问题,您是如何检查的?

记住:

  • SetMaxThreads 设置在任何给定时刻运行池线程的最大数量,而不是排队的任务。
  • QueueUserWorkItem 将任务添加到队列中,但并不一定要运行它。如果池中没有未使用的线程,则任务将等待。但它会被创建并添加到ThreadPool 的队列中。

【讨论】:

    【解决方案3】:

    ThreadPool.SetMaxThreads(50, 50) 返回一个布尔值。

    请检查是否为真,如果不是则设置操作不成功。

    你能调试这个应用程序吗? 如果是,当有 200 个线程时按“暂停”按钮。

    添加线程窗口 - 在“调试”菜单上,指向 Windows,然后单击“线程”。

    看看这些线程做了什么。也许您在应用程序的其他地方启动了新线程。

    另外,如果您使用的是 .NET 4.0,我建议您使用 Task Parallel Library API (http://msdn.microsoft.com/en-us/library/dd537609.aspx) 而不是直接使用线程池。

    【讨论】:

    • 我正在使用 .net 2.0,当我这样做时 dim blnResult as Boolean = ThreadPool.SetMaxThreads(50, 50) 值是 true
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-07-14
    • 2019-07-07
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多