2016-07-28 26 views
0

私はいくつかのWebページリンクを含むsources()の配列を持っています。それらはGrabProxies()関数を経由します。VB.NET - QueueUserWorkItem Completion

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

単純な変数インクリメンタル方式を使用して、すべてのソースが終了しているかどうかを確認します。問題は、それは効率的ではないということです、時間の半分はそれが(2つのスレッドが正確に同じ時間か何かで終えおそらくので?)、それを検出しない

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

    console.writeline("Finished!") 

End If 

いずれかの方法では、それは効率的な方法ではありませんこれを機能させるにはどのように私は信号を取得し、終了時に少量のコードを完了することができますか?

EDIT:可変メソッドは実際には効率が悪いです。長い関数(それが終了する前に20〜30秒)を8回実行し、実際には4/8回しか実行しませんでした。 (15スレッドを使用)

EDIT 2:ソースアレイ上でNew Random()を使用した後は、より多くの時間がかかるようです。タイムアウトの問題などが発生した場合、それはあまり効果がないように見えるようになります。

ThreadPoolスレッドが実行されているかどうかを確認する方法はありますか?そして、0が実行されている場合、アクションを実行しますか?ちょうどここで推測する。どうすればいいのか分かっていれば教えてください。

答えて

0

解決策が見つかりました!正直なところ、これがなぜ実際にはうまくいかないのかは分かりませんが、私は10回テストしました。

置き換え Sources_CountTemp += 1(またはものは何でも使う増分法の一種)を持つ:あなたは競合状態を持っている

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

+0

- ので、UIへの増分を押してレースを排除します。 – Enigmativity

関連する問題