在任务流程中递增数字

时间:2018-06-22 02:14:59

标签: vb.net multithreading parallel-processing

我正在努力研究如何正确增加我在任务过程中拥有的计数器。

我的程序创建了一堆用于操纵和保存图像的任务。该过程的一部分是通过增量计数器自动重命名文件。

即: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)

由于多个线程正在访问该变量,因此该过程无法正常工作,最终导致输出错误。

我确信我缺少一些明显的东西,甚至犯了一些严重的禁忌,就像我刚接触并行技术一样。.因此,如果可以的话,请对我轻松一点!

任何建议,我将不胜感激。我环顾四周,可以看到与线程“竞赛条件”相关的类似问题,但似乎无法在我的特定实例中起作用。

先感谢堆。

1 个答案:

答案 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())

将安全地产生所需的行为。