Это может дать вам отправную точку. Идея состоит в том, чтобы использовать очередь блокировки, которая будет блокировать операцию удаления из очереди, пока элемент не станет доступен. Таким образом, ваши рабочие потоки будут вращаться вокруг бесконечного цикла, ожидая появления элементов в очереди. Ваш основной поток поставит элементы в очередь. В следующем примере используется класс BlockingCollection из .NET 4.0 BCL. Если это недоступно вам, вы можете получить реализацию очереди блокировки из блога Стивена Туба .
Module Example
Private m_Queue As BlockingCollection(Of String) = New BlockingCollection(Of String)
Sub Main()
Dim threads(4) As Thread
For i As Integer = 0 To threads.Length - 1
threads(i) = New Thread(AddressOf Consumer)
threads(i).IsBackground = True
threads(i).Start()
Next
Dim files As IEnumerable(Of String) = GetFilesToCopy()
For Each filePath As String In files
m_Queue.Add(filePath)
Next
End Sub
Sub Consumer()
Do While True
Dim filePath As String = m_Queue.Take()
' Process the file here.
Loop
End Sub
End Module