2013-05-01 226 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