2012-04-03 190 views
0

確定這裏是我的代碼:多線程 - 添加更多的線程,並繼續操作

For i = 0 To 10 
     Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld) 
     tTemp.IsBackground = True 
     'tTemp.Start(geturl) 
     lThreads.Add(tTemp) 
     'MsgBox(lThreads.Item(i).ThreadState) 
    Next 

我創建的線程有10個線程的列表,爲它們分配的功能,性能,並將它們添加到列表中。

'While ListBox2.Items.Count > 0 
    For i = 0 To lThreads.Count - 1 
     If (lThreads.Item(i).ThreadState = 12) Then 
      If (ListBox2.Items.Count > 0) Then 
       lThreads.Item(i).Start(geturl) 
       If (i = lThreads.Count - 1) Then 
        i = 0 
       End If 
      Else 
       Exit For 
      End If 
      'MsgBox(lThreads.Item(i).ThreadState) 
     ElseIf (lThreads.Item(i).ThreadState = 16) Then 
      lThreads.RemoveAt(i) 
      Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld) 
      tTemp.IsBackground = True 
      lThreads.Add(tTemp) 
      If (i = lThreads.Count - 1) Then 
       i = 0 
      End If 
     End If 
    Next 

發生了什麼事情,我看到函數dwnld完成後線程停止。所以我首先檢查狀態(12表示背景和未啓動)。在情況12啓動線程,並在案件16(停止)刪除該特定的線程,並添加一個不同的線程,如我在上面添加10。

還有一個檢查,當我的計數器到達最後一個號碼,通過分配i = 0重新啓動整個循環。

該程序下載一些網頁,url從listbox2傳遞。 geturl會傳遞url並將其從列表中刪除。所以當列表框爲空時,退出for循環。

但上面的代碼只運行了11次,並沒有重新啓動。我試着用標籤和轉到,但它簡單的掛起。

有誰能告訴我該怎麼辦?

我想要的是保持10個線程繼續下載網頁,當列表爲空時退出該功能。

回答

2

試圖手動管理自己的自定義線程池可能是錯誤的方法。使用ThreadPool.QueueUserWorkItem或最好是新的Task類。線程池爲您管理,極大地簡化了代碼。完全取消這段代碼,重新開始使用我剛剛提到的技術之一。如果遇到實施上述任一技術的問題,請發佈更具體的問題。

+0

好吧,我會檢查出來。感謝讓我知道回合:) – xhammer 2012-04-03 15:23:09

+0

@ xhammer:沒問題,並再次發佈另一個問題,如果你遇到這些新技術的麻煩。 – 2012-04-03 16:03:06

1

線程的微觀管理是一個非常糟糕的主意。當我看到有人試圖維護不斷創建,終止和銷燬的線程列表時,我只知道它們註定要失敗。我看到有經驗的專業人士試圖做到這一點 - 看起來很有趣,等待幾個月後試圖解決不可修復的問題,不可避免的壯觀失敗。

線程池通常不是那種類型。它們通常是一組任務 - 生產者 - 消費者隊列上的任務類實例 - 多個線程在可以自由工作時饋送。工作線程可以在完成舊任務時自行完成新任務 - 無需任何更高級的微管理。

收聽@布萊恩 - 忘記管理線程列表,檢查他們的狀態和所有困難。它只會讓你生病。使用ThreadPool.QUWI或任務。