更新:
更改了我的代码并将节点添加到并行循环中的树视图中,但是我遇到了ArgumentException错误。
在SetNode.Nodes.Add(CardNode)
我得到Source array was not long enough. Check srcIndex and length, and the array's lower bounds.
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在后台构建TreeView。在BackgroundWorker.DoWork中,我想尝试将我的孩子并行添加到他们正确的父母中,因为他们有~25k,但我遇到了一个奇怪的(至少对我来说)抛出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的地方。
答案 0 :(得分:0)
你不应该同时这样做。树节点不是线程安全的,我想它应该只在创建它的同一个线程中访问(应该是UI线程)。
如果您有许多节点,您可能会考虑延迟加载只有可见节点,这会占用更多代码并变得更加复杂,但可以使您的UI更具响应性。