2012-10-24 3 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) 

Нет необходимости для Tasklist и присоединение нити

Смежные вопросы