如何等待threadPools中的所有工作线程都消失了

时间:2012-01-23 02:23:23

标签: vb.net multithreading threadpool

任何人都知道这样做的简单方法吗?

基本上在我排队所有作品之后,我想等到我排队的所有内容都已完成。我该怎么做?

   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)

我注意到无法知道线程池中仍有多少线程在运行。

2 个答案:

答案 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

我觉得这很尴尬。必须有更好的方法。