Parallel.Foreach,将子节点添加到父节点

时间:2015-09-17 18:15:02

标签: .net vb.net parallel-processing treenode parallel.foreach

更新:

更改了我的代码并将节点添加到并行循环中的树视图中,但是我遇到了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的地方。

1 个答案:

答案 0 :(得分:0)

你不应该同时这样做。树节点不是线程安全的,我想它应该只在创建它的同一个线程中访问(应该是UI线程)。

如果您有许多节点,您可能会考虑延迟加载只有可见节点,这会占用更多代码并变得更加复杂,但可以使您的UI更具响应性。