2012-10-24 45 views
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 

回答

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 
0

我的建議是使用線程池。線程池有很多內置的優化。例如線程池可以確定機器的核心數量,並相應地計劃線程數量。如果創建的線程數量更多但未正確使用,則線程池將終止其他線程。

考慮用線程池重構代碼。線程池還可以選擇限制線程數量(但不建議這樣做)。

0

我建議使用ThreadPool來代替。您可以使用SetMin | MaxThreads方法限制它使用的線程數。

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) 

無需一個任務列表,並加入線程