我试图浏览一个1-X项目列表并在任务中处理它们以加快处理的完成(它们会产生有时需要很短时间完成的Web请求)。我试图总结处理完成时返回的小数,而不是第二次循环遍历列表。就像现在一样,总和被每个任务覆盖而不是被添加到。
我可以在将总和添加到总和之前插入一个短暂的暂停,这似乎工作正常,但我确信有更好的解决方案。
我已经看过提及SyncLock,但我无法在Decimal上使用它。
这是我为测试编写的一些代码。 .Process方法只是等待一个随机的秒数,并将.Value属性设置为随机小数。
有任何改进建议并以适当的方式计算总和吗?
Try
Dim lstItem As List(Of clsItem) = GetList()
Dim lstViewItem As New List(Of ListViewItem)
Dim lstTasks As New List(Of Task)()
Dim decTotal As Decimal = 0.0
For i As Int32 = 0 To lstItem.Count - 1
Dim j As Int32 = i
Dim t As Task = Task.Run(Sub()
lstViewItem.Add(New ListViewItem(New String() {j, lstItem(j).Process()}))
'System.Threading.Thread.Sleep(j * 1000)
decTotal += lstItem(j).Value
End Sub)
lstTasks.Add(t)
Next
Task.WaitAll(lstTasks.ToArray())
lstView.Items.AddRange(lstViewItem.ToArray())
lstView.Items.Add("")
lstView.Items.Add(decTotal)
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try