2016-07-28 33 views
0

我有一個包含一些網頁鏈接數組sources(),他們經過GrabProxies()功能。VB.NET - QueueUserWorkItem完成

For Each source In sources 
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf GrabProxies), source) 
Next 

我用一個簡單的Variable Incrementing方法來檢查是否所有的源都完成了。問題是,它是沒有效率的一半時間不會檢測到它(大概是因爲兩個線程完成在精確的同一時間或某事?)

Dim Sources_CountTemp As Integer 
Private Function GrabProxies(source As String) 
(...) 
If Sources_CountTemp = sources.Count Then 

    console.writeline("Finished!") 

End If 

無論哪種方式,它不是一種有效的方法讓這個工作。我怎樣才能設法獲得信號並在完成時完成少量代碼?

編輯:變量方法是真是非有效,我跑的這8個運行一個長功能(它完成20-30秒前),只有4/8的時間是實際工作。 (使用15個線程)

編輯2:看起來工作更多的時間,一旦我在源陣列中使用的New Random()。所以這意味着當超時問題等發生時,它使它不能工作。

有沒有辦法來檢查是否有任何ThreadPool線程正在運行?如果0運行,然後做一個動作?只是在這裏猜測。如果你對我應該怎麼做有任何想法,請告訴我。

回答

0

我找到了解決方案!老實說,不知道爲什麼這個實際上它應該有所作爲,但我測試了10次,所有10次它的工作!

更換 Sources_CountTemp += 1(或任何一種使用增量方向法)與:

Invoke(New MethodInvoker(Sub() Sources_CountTemp += 1))

+0

你有一個競爭條件 - 因此推動增量的UI消除了比賽。 – Enigmativity