2012-03-06 29 views
1

在我最近接管的一個項目中,有一個調用函數做了一些計算;這被連續調用幾次(通常在1到10次之間)。關於vb.net中後臺處理的建議

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之間)。

任何人都可以提出一個方法來做到這一點 - 我正在尋找一種簡單的方法基本上說:「好了,所有的任務都在這一點後,調用另一個任務」

懸崖

  • 一些任務需要在同一時間(1到10之間)
  • 每個任務需要幾秒鐘
  • 代碼當前工作運行 - 它確實他們都在同一時間
  • 一旦(1-10之間)中的所有任務都完成 ,火了一些其他的代碼(僅當所有任務都完成) - 停留在最好的方法做以下
+2

如果可以的話,我想這個返工使用Parrel任務庫。雖然在其他線程上等待的方法稱爲'Join'。在這裏閱讀有關它:http://msdn.microsoft.com/en-us/library/95hbf2ta.aspx – asawyer 2012-03-06 16:46:28

+0

我不知道有一種方法來等待線程完成而不使用回調。我建議不要爲每個任務啓動一個線程,可能將它們合併爲多個任務,並報告每個組的狀態。 – 2012-03-06 17:15:21

+0

@asawyer - 雖然你的建議是健全的。 TPL尚未準備好迎接黃金時段。根據我的理解,它將包含在.NET Framework 4.5中。他不需要使用TPL來使用Thread.Join方法。你必須小心Thread.Join,你可以很容易造成自己的僵局。 – 2012-03-06 17:18:34

回答

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 
1

最簡單的方法是把所有的將新線程放入列表中,然後遍歷該列表並在每個列表上調用。連接方法阻止當前線程,直到線程要加入完成:如果在下面的代碼 - 我沒有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中的類,因爲這提供了比啓動和管理自己的線程更好的範例。