2

データを非同期に処理するさまざまな方法を試してきました。画像処理アプリケーションでこのようなタスクを実行するコード ブロックがありますが、私には扱いにくいように思えます。現在の標準に合わせた提案、または従うべきコーディング規則を探しています。

' this code is run on a background thread
Dim lockThreadCounter As New Object()
Dim runningThreadCounter As Integer = 0
Dim decrementCounterCallback As New AsyncCallback(
    Sub()
        SyncLock lockThreadCounter
            runningThreadCounter -= 1
        End SyncLock
    End Sub)
runningThreadCounter += 1
widthsAdder.BeginInvoke(widthsSlow, decrementCounterCallback, Nothing)
runningThreadCounter += 1
widthsAdder.BeginInvoke(widthsFast, decrementCounterCallback, Nothing)
runningThreadCounter += 1
bruteForceCalculateR2.BeginInvoke(numberOfSamples, pixelsSlow, decrementCounterCallback, Nothing)
runningThreadCounter += 1
bruteForceCalculateR2.BeginInvoke(numberOfSamples, pixelsFast, decrementCounterCallback, Nothing)
' wait here for all four tasks to complete
While runningThreadCounter > 0
    Thread.Sleep(1)
End While
' resume with the rest of the code once all four tasks have completed

考えてみましParallel.Foreachたが、タスクのデリゲートのフットプリントが異なるため、それを使用したソリューションを思いつくことができませんでした。

4

1 に答える 1

6

Taskクラスを使用して、作業を開始Task.WaitAllし、完了するまで待つことができます。

これにより、各タスクをグループとして保存して待機できるため、「実行中のスレッド カウンター」を用意する必要がなくなります。

これは次のようになります (コールバックを削除すると):

Dim widths1 = Task.Factory.StartNew(Sub() widthsSlow())
Dim widths2 = Task.Factory.StartNew(Sub() widthsFast())
Dim bruteForce1 = Task.Factory.StartNew(Sub() numberOfSamples(pixelsSlow))
Dim bruteForce2 = Task.Factory.StartNew(Sub() numberOfSamples(pixelsFast))

' Wait for all to complete without the loop
Task.WaitAll(widths1, widths2, bruteForce1, bruteForce2)
于 2013-07-09T16:16:44.433 に答える