我继承了下面的一些代码,工作正常,唯一的问题是,我希望能够限制任何时候运行的线程数,此时我有大约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
答案 0 :(得分:0)
我的建议是使用线程池。线程池内置了许多优化功能。例如线程池可以确定机器具有的核心数,并相应地计划线程数。如果创建了更多线程但未正确使用,则线程池将终止其他线程。
考虑使用线程池重构代码。线程池还可以选择限制线程数(但不建议这样做。)
答案 1 :(得分:0)
我建议改用ThreadPool。您可以使用SetMin | MaxThreads方法限制它使用的线程数。
答案 2 :(得分: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)
无需任务列表并加入线程
答案 3 :(得分:0)
尝试使用Semaphore例如:
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