寻找丑陋的多线程的标准替代品

时间:2013-07-09 16:15:31

标签: .net vb.net multithreading

我一直在尝试异步处理数据的不同方法。我有一段代码在图像处理应用程序中完成了这样的任务,但对我来说似乎很尴尬。我正在寻找符合当前标准的建议,或者遵循的编码惯例:

' 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,但由于任务有不同的委托足迹,因此无法提出使用它的解决方案。

1 个答案:

答案 0 :(得分: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)