我正在努力研究如何正确增加我在任务过程中拥有的计数器。
我的程序创建了一堆用于操纵和保存图像的任务。该过程的一部分是通过增量计数器自动重命名文件。
即:Filename_001.jpg,Filename_002.jpg,Filename 003.jpg
下面的基本伪示例:
dim counter as integer = 0
for each file in folder
tasks.add(task.factory.startnew(sub()
using imgProcess(image, filename & counter & ".jpg")
end using
counter +=1
end sub))
next
Task.WaitAll(tasks.ToArray())
我尝试使用Interlocked.Increment
代替下面的counter+=1
Interlocked.Increment(counter)
由于多个线程正在访问该变量,因此该过程无法正常工作,最终导致输出错误。
我确信我缺少一些明显的东西,甚至犯了一些严重的禁忌,就像我刚接触并行技术一样。.因此,如果可以的话,请对我轻松一点!
任何建议,我将不胜感激。我环顾四周,可以看到与线程“竞赛条件”相关的类似问题,但似乎无法在我的特定实例中起作用。
先感谢堆。
答案 0 :(得分:1)
将计数器移到“任务”的“子”之外。还要使用Task.Run
,而不要使用工厂。
更好的是,构造文件名,然后在委托中使用它。
例如
Dim folder() As String = {"file", "file", "file", "file", "file", "file", "file"}
Dim tasks As New List(Of Task)()
Dim counter As Integer = 0
For Each filename in folder
Dim file = filename & "_" & counter & ".jpg"
Dim task As Task = Task.Run(Sub()
Console.WriteLine("Hello World " & file)
End Sub)
tasks.Add(task)
counter += 1
Next
Task.WaitAll(tasks.ToArray())
将安全地产生所需的行为。