关于vb.net中后台处理的建议

时间:2012-03-06 16:44:56

标签: vb.net multithreading

在我最近接手的一个项目中,有一个调用函数进行一些计算;这是连续多次调用(通常在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,此时所有任务都已完成,再调用另一项任务”

悬崖

  • 需要同时运行多个任务(1到10之间)
  • 每项任务需要几秒钟
  • 代码目前有效 - 它可以同时执行所有操作
  • 一旦完成所有任务(1-10之间) 完成后,触发其他一些代码(仅当所有任务都完成时) - 坚持使用最佳方法执行以下操作

2 个答案:

答案 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