.net Parallel.Foreach,将子节点添加到父节点
更新: 更改了我的代码并将节点添加到树视图的操作移出并行循环,但我遇到了ArgumentException错误 在.net Parallel.Foreach,将子节点添加到父节点,.net,vb.net,parallel-processing,treenode,parallel.foreach,.net,Vb.net,Parallel Processing,Treenode,Parallel.foreach,更新: 更改了我的代码并将节点添加到树视图的操作移出并行循环,但我遇到了ArgumentException错误 在SetNode.Nodes.Add(CardNode)我得到的源数组不够长。检查srcdex和length,以及数组的下限。 Parallel.ForEach(CardSetIDs, Sub(CardSetIDArray) CardName = CardSetIDArray(0) SetName = CardSetIDArray(1) CardID = Car
SetNode.Nodes.Add(CardNode)
我得到的源数组不够长。检查srcdex和length,以及数组的下限。
Parallel.ForEach(CardSetIDs, Sub(CardSetIDArray)
CardName = CardSetIDArray(0)
SetName = CardSetIDArray(1)
CardID = CardSetIDArray(2)
SetNode = SetNodesDict(SetName)
CardNode = New TreeNode(CardName)
CardNode.Tag = CardName & " - " & SetName
AllCardsDict.TryAdd(CardName & " - " & SetName, CardID)
SetNode.Nodes.Add(CardNode)
bgwBTV.ReportProgress(CardProgress)
CardsDone += 1
CardProgress = PercentDone(CardsDone, CardSetIDs.Count)
End Sub)
我正试图通过BackgroundWorker在后台构建一个树视图。在BackgroundWorker.DoWork中,我想尝试并行地将我的孩子添加到他们的适当父母中,因为他们有大约25000人,但我遇到了一个奇怪的情况(至少对我来说),因为密钥已经存在,所以抛出了ArgumentException,即使保存节点数据的数组中没有重复项
Parallel.ForEach(ParentChildIDs, Sub(ParentChildIDArray)
ChildName = ParentChildIDArray(0)
ParentName = ParentChildIDArray(1)
ChildID = ParentChildIDArray(2)
ParentNode = trvParents.Nodes(ParentName)
ChildNode = New TreeNode(ChildName)
ChildNode.Tag = ChildName & " - " & ParentName
AllChildrenDict.Add(ChildName & " - " & ParentName, ChildID)
ParentNode.Nodes.Add(ChildNode)
bgw.ReportProgress(ChildProgress)
ChildrenDone += 1
ChildProgress = PercentDone(ChildDone, ParentChildIDs.Count)
End Sub)
粗体的线条是我遇到ArgumentException的地方。你不应该同时这样做。树节点不是线程安全的,我想应该只在创建它的同一个线程(应该是UI线程)中访问它
如果你有很多节点,你可能会考虑只加载可见节点,这会占用更多代码,变得更复杂,但是可以使你的UI变得更具响应性。
刚刚发现了关于并发字典对象,所以,这回答了我对AllChildrenDict的问题,但是,我仍在为我的TreeNodes寻找解决方案。TreeNodes呢?由于多个线程试图更改同一个节点集合,因此会出现错误。ConcurrentDictionary
仅同步对字典本身的访问。您还需要同步对节点集合的访问。