在我最近接手的一个项目中,有一个调用函数进行一些计算;这是连续多次调用(通常在1到10次之间)。
While dr.read ‘depending on a db call, loop 1 or more times
Dim calc As New CalcClass
Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff))
newDoStuff.Start(calc)
End while
Private Sub DoStuff(ByVal calc As Object)
‘do something that takes between 5-10 seconds
End sub
为了加快速度,我试图添加异步处理(参见上面的例子),这在我的代码中有效,所有任务都在同一时间完成,但我不明白的是如何等待在完成所有任务完成后需要运行的最终任务之前,所有这些线程都要完成(没有设置的线程数,可以在1到10之间,具体取决于其他一些数据)。
任何人都可以提出一种方法来做到这一点 - 我正在寻找一种简单的方法来基本上说“O.k,此时所有任务都已完成,再调用另一项任务”
悬崖
答案 0 :(得分:1)
最简单的方法是将所有新线程放入列表中,然后遍历该列表并在每个列表上调用.Join()。 join方法阻塞当前线程,直到您要加入的线程完成:
道歉,如果下面的代码中有任何语法错误 - 我没有VB方便,而且我对语法的记忆非常生疏:
Dim threadList as New List(Of Thread)
While dr.read ‘depending on a db call, loop 1 or more times
Dim calc As New CalcClass
Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff))
newDoStuff.Start(calc)
threadList.Add(newDoStuff)
End while
For Each t as Thread in ThreadList
t.Join
End For
话虽如此,我强烈建议您考虑使用System.Threading.Tasks namespace中的类,因为这提供了比启动和管理自己的线程更好的范例。
答案 1 :(得分:1)
将所有主题放入列表
Dim threads As new List(Of System.Threading.Thread)
While dr.read ‘depending on a db call, loop 1 or more times
Dim calc As New CalcClass
Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff))
threads.Add(newDoStuff)
newDoStuff.Start(calc)
End while
最后加入你所有的线程
For Each thread In threads Do
thread.Join()
Next