2013-05-01 181 views
0

之前,我有一個線程數是需要在運行(約160),創建文件,然後將它們複製到不同的地方:等待線程完成執行上

'Files is basically a list of strings 
'which is passed to a function that creates a file from a number of database fields 
'when thats done it copies it to a number of places 

     For Each x In Files 
      Dim Evaluator = New Thread(Sub() API.Files.Create.Standard(x)) 
      Evaluator.Start() 
     Next 

我希望它做的是斷火160個左右的線程(使用permitter x)然後等待所有線程完成,然後繼續執行其餘的程序。

回答

7

如果您使用的是Framework 4.0(對於3.5 Jon Skeet有解決方案@Can I use the task parallel library in a .Net 3.5 project?)。而不是使用線程,你可以使用TPL(任務處理庫)。它是圍繞線程的包裝。所以簡而言之,創建任務,它有靜態方法Task.WailAll允許預期的功能。

Dim tasks = New Task(160) {} 
For i As var = 0 To 160 
    Dim x = i 
    tasks(i) = Task.Factory.StartNew(Function() New CreateFileClass(x).[Do]()) 
Next 

Task.WaitAll(tasks) 

我已經使用從Task Parallel Library - Know when all tasks are finished代碼和使用在線C#到上面的代碼產生VB.Net轉換器。我希望它有幫助。

+0

'Dim x = i'是多餘的,否則是一個很好的答案。我準備發佈一個類似的解決方案,但你提前做了。 +1 – Neolisk 2013-05-01 17:27:14

+0

我同意這是多餘的。邪惡的複製/粘貼:)。 – TorontoKid 2013-05-01 17:29:13

+1

如果使用TPL路由,使用直接的'Parallel.ForEach(Files,Sub(x)API.Files.Create.Standard(x))',OP的情況甚至會變得更簡單。 – 2013-05-01 17:35:54