djv*_*djv 2 .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
Run Code Online (Sandbox Code Playgroud)
我想过Parallel.Foreach但是无法提出使用它的解决方案,因为任务有不同的代表足迹.
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |