gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:39:54 24 4
gpt4 key购买 nike

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

' 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 但无法想出使用它的解决方案,因为任务具有不同的委托(delegate)足迹。

最佳答案

您可以使用 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)

关于.net - 寻找丑陋的多线程的标准替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17553226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com