用QueueUserWorkItem使用WINDOWS的线程池的时候,好像无法控制线程池里的线程数量?
如何才能做到控制线程池里的线程数量呢?

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2755/2755676.xml?temp=.8531
      

  2.   

    windows api没有提供控制线程池中线程数量的函数,无法控制,这些都是由系统自已调整的。如果你想控制的话,只能自己实现线程池
      

  3.   

    运用系统线程池的第一步就是用下面的代码创建你想让线程执行的方法:    Private Sub CallDoWork(ByVal State As Object)
            Dim currentWorker As New Worker()
            currentWorker.DoSomeWork()
            Me.pgbStatus.Value += 1
        End Sub 
    该方法的定义必须与System.Threading.WaitCallback委派的定义相符。在VB语法中,这就是说,该方法必须被声明为一个Sub,它采用一个单独的叫做State的Object参数。接下来,你只需要调用ThreadPool.QueueUserWorkItem方法,传入CallDoWork方法的地址:        For currentWorkItem = 1 To 100
                Dim threadQueueCallback As New _
                   WaitCallback(AddressOf CallDoWork)
                   ThreadPool.QueueUserWorkItem( _
                      threadQueueCallback)
            Next 
    注意,ThreadPool这个类是静态的,所以你不需要创建它的一个实例——你可以只运用它。在运行该代码时,100条任务会被放在线程池的任务队列上。然后CLR通过监控队列中任务数量来管理队列中的线程数量。在一个单个CPU机器上,会很快生成25个线程并添加到系统线程池中,但这个数量不会超过25个。运用系统线程池可以让你控制你的应用程序将会生成的线程数量。对于一些你不能控制的情况(如到达队列的消息或调用一个Web service的用户),能够控制线程数量就显得很重要了。运用线程池就可以让你确保你的应用程序的行为是可以预测的,即使它处理的负荷在不断增加。
      

  4.   

    CreateIoCompletionPort可以控制线程池中的线程数量, 不过I/O Completion Port的机制比较费解, 不象其他几个线程池API那样直观。我记得CSDN上有过这方面的贴子,你查查。