Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Parallel.Foreach,将子节点添加到父节点_.net_Vb.net_Parallel Processing_Treenode_Parallel.foreach - Fatal编程技术网

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

.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

更新:

更改了我的代码并将节点添加到树视图的操作移出并行循环,但我遇到了ArgumentException错误

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
仅同步对字典本身的访问。您还需要同步对节点集合的访问。