2016-07-28 62 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