2012-01-23 7 views
0

誰も簡単な方法を知っていますか?threadPools内のすべてのワーカースレッドがなくなるまでの待ち時間

私はすべての作品を待ち行列に入れた後、私が待ち行列に入れられたすべてが完了するまで待ちたいと思います。どうすればいいですか?

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

スレッド結合をお探しですか?呼び出し元のプロセス(またはスレッド)から、続行する前にスレッドが参加するのを待つ必要があります。 – Shredderroy

+0

私はスレッド結合を行うことができますが、スレッドプール内のスレッドをどのように知ることができますか? –

+0

これはあなたがこれから始めるはずです。http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.80).aspx – VS1

答えて

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 

これは単なる扱いにくいと思います。より良い方法が必要です。

+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 

は、あなたがスレッドカウント場合、スレッド・カウンタを減少させ、ロックを解除する必要があります

lock.WaitOne() 
:あなたのスレッドの

threadcount = threadcount - 1 
if threadcount = 0 then 
    lock.Release() 
end if 

0待機しているときに、誰かがリリース呼び出すまでブロックしますセマフォを、AQUIREしよう

上記の減少と検査の操作では、おそらく別のサブルーチンに入れたいと思うでしょう。また、カウンタにアクセスしようとする各スレッドが他のスレッドから分離されるように、これを保護する必要があります。

dim counterMutex = new Mutex() 
sub decreaseThreadCount() 
    counterMutex.WaitOne() 
    threadcount = threadcount - 1 
    if threadcount = 0 then 
     lock.Release() 
    end if 
    counterMutex.release() 
end sub 
+1

私はVijayが提供するWaitHandleのリンクを参照してください。これは同じ目的を達成するためのより高いレベルのアプローチです。私の答えは、セマフォを使った同期のテキストブックの例です.WaitHandleは、同じ原則のより高いレベルのアプリケーションであるようです。 –

+0

メインスレッドに通知したい場合は(最後のスレッド(スレッドセーフカウンタを0に減らす))、Invoke/BeginInvoke(スレッドセーフカウンタを0にする)の方が一般的ですスレッド/スレッドプールの活動中にブロックしないようにします。 –

+0

+1でも複雑すぎる –

関連する問題