任何人都知道这样做的简单方法吗?
基本上在我排队所有作品之后,我想等到我排队的所有内容都已完成。我该怎么做?
loopThroughAllBlog(whattodo, login)'queue all works
//在这里做什么等待所有排队的工作完成。
Dim whatToWrite = New Generic.List(Of String)
For Each domain In domainsSorted
whatToWrite.Add(dictionaryOfOutput.Item(domain))
Next
coltofile(whatToWrite, "output.txt", True)
我注意到无法知道线程池中仍有多少线程在运行。
答案 0 :(得分:4)
实现此目的的常用方法是使用受信号量保护的计数器。 (在我看来你的代码是VB。我不知道VB,所以我的语法很可能已经关闭了,就像伪代码一样对待它。)
首先,您需要设置信号量和计数器:
' a semaphore is a counter, you decrease it with WaitOne() and increase with Release()
' if the value is 0, the thread is blocked until someone calls Release()
Dim lock = new Semaphore(0, 1)
Dim threadcount = 10 ' or whatever
在线程池运行的函数结束时,您需要减少线程计数器,并在threadcount为0时释放锁定
threadcount = threadcount - 1
if threadcount = 0 then
lock.Release()
end if
在等待你的线程时,尝试获取信号量,信号量将被阻塞,直到有人呼叫释放:
lock.WaitOne()
对于上面的减少和检查操作,您可能希望将其放在单独的子例程中。您还需要保护它,以便尝试访问计数器的每个线程都与其他线程隔离。
dim counterMutex = new Mutex()
sub decreaseThreadCount()
counterMutex.WaitOne()
threadcount = threadcount - 1
if threadcount = 0 then
lock.Release()
end if
counterMutex.release()
end sub
答案 1 :(得分:0)
我最后回答了我自己的问题,因为没有答案。
Public Function threadPoolIdle() As Boolean
Dim workerThreads As Integer
Dim completionPorts As Integer
Dim maxWorkerThreads As Integer
Dim maxCompletionPorts As Integer
Dim stillWorking As Integer
Threading.ThreadPool.GetAvailableThreads(workerThreads, completionPorts)
Threading.ThreadPool.GetMaxThreads(maxWorkerThreads, maxCompletionPorts)
stillWorking = maxWorkerThreads + maxCompletionPorts - workerThreads - completionPorts
If stillWorking > 0 Then
Return False
Else
Return True
End If
End Function
Public Sub waitTillThreadPoolisIdle()
Do
Sleep(1000)
Application.DoEvents()
Loop While threadPoolIdle() = False
End Sub
我觉得这很尴尬。必须有更好的方法。