как начать новый поток, как только предыдущий поток закончен? - PullRequest
1 голос
/ 23 июля 2010

Мне нужно разработать службу Windows, которая будет копировать файлы на разные серверы. Так что я должен сделать эту задачу, используя мульти-тейдинг. Но я должен начать только 3-4 темы. Таким образом, всякий раз, когда один поток заканчивается, я должен начать новый поток, чтобы количество потоков оставалось 3 или 4. Так как я могу применить проверку на это? пожалуйста, предоставьте некоторую информацию об этом.

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

Почему бы не использовать темы вместо порождения новых? Кроме этого посмотрите на шаблон, известный как очередь производителя / потребителя. Ваш производитель добавляет файлы (информацию о своем пути), потребители читают это и предпринимают соответствующие действия (выполняют операцию копирования)

1 голос
/ 23 июля 2010

Это может дать вам отправную точку. Идея состоит в том, чтобы использовать очередь блокировки, которая будет блокировать операцию удаления из очереди, пока элемент не станет доступен. Таким образом, ваши рабочие потоки будут вращаться вокруг бесконечного цикла, ожидая появления элементов в очереди. Ваш основной поток поставит элементы в очередь. В следующем примере используется класс 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
0 голосов
/ 23 июля 2010

В .Net 4.0 это очень легко сделать с помощью задач:

Dim a As new Task(AdressOf doWork).ContinueWith(AdressOf doOtherWork)

См. здесь для большего количества примеров (в C #).

0 голосов
/ 23 июля 2010

Я не знаю VB, но все другие языки, которые я знаю, имеют такую ​​операцию для такого рода вещей: join ().

int main(){
  threadA.start();
  threadA.join(); //here main() wait threadA end
  threadB.start(); //what you want
}

Извините за not_vb.Я написал это, потому что ожидаю ту же функцию с тем же именем в VB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...