0

我继承了下面的一些工作正常的代码,唯一的问题是,我希望能够限制任何时候运行的线程数,目前我有大约 8-10 个并行运行的作业,我想要随时将线程数限制为 3 或 4,这是否可以使用下面的代码而无需太多更改?

Public Sub threading_Example()

 Dim threadList As New List(Of Thread)

 For n = 0 To numJobs 'about 8-10 normally

     Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))
     Dim job As New Job

     'job.stuff = stuff

     newJob.Start(job)
     threadList.Add(new_job)

 Next

 For Each t As Thread In threadList
     t.Join()
 Next

End Sub

Public Sub do_Job(ByVal job As Object)
   'do task 
End Sub
4

4 回答 4

0

根据您使用的版本,您也可以简单地试试这个:

Parallel.For(0, 10, 
            (New ParallelOptions() With {.MaxDegreeOfParallelism = 4}), 
             Sub(i As Integer)
                ' do job        
                System.Threading.Thread.Sleep(2000)
                Debug.Print("done no. {0}", i)
             End Sub)

无需任务列表并加入线程

于 2012-10-24T12:25:30.307 回答
0

尝试使用信号量,例如:

ReadOnly Sem As New Semaphore(3, 4)

    Sub Main()

        Dim threadList As New List(Of Thread)
        Dim numJobs As Integer
        For n = 0 To numJobs

            Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))

            new_job.Start()
            threadList.Add(new_job)

        Next

        For Each t As Thread In threadList
            t.Join()
        Next


    End Sub


    Public Sub do_Job(ByVal job As Object)

        Sem.WaitOne()
        'only 3 or 4 threads at time can do task
        Sem.Release()
    End Sub
于 2012-10-24T12:25:54.607 回答
0

我的建议是使用线程池。线程池内置了许多优化。例如,线程池可以确定机器拥有的内核数,并相应地调度线程数。如果创建的线程数量更多但没有得到正确利用,线程池将杀死额外的线程。

考虑使用线程池重构代码。线程池还可以选择限制线程数(但不推荐这样做。)

于 2012-10-24T11:54:29.160 回答
0

我建议改用 ThreadPool。您可以使用 SetMin|MaxThreads 方法限制它使用的线程数。

于 2012-10-24T11:55:21.827 回答