0

我正在尝试将 AOT CUS 层导出为 XPO 文件。参考这个问题。我已经从上述问题的答案中提出了很好的建议,但我遇到了“内存不足”的问题。我做了一些进一步的研究和一些额外的实验。这是我用来爬下 AOT 树并仅导出属于“CUS”层的节点的算法示例。

private void GetAOLHelper(TreeNode baseNode, str baseExportDirectory, int currentLevel, int maxLevel)
{
    int cusLayerTest;
    int CusLayerValue = 4096;
    str ExportFileName = "";
    str ExportDirectoryName = "";
    TreeNode nextNode;

    if (baseNode != null)
    {
        cusLayerTest = CusLayerValue & baseNode.applObjectLayerMask();
        if (cusLayerTest > 0)
        {
            ExportFileName = baseNode.AOTname() + ".xpo";
            this.NodeExport(baseNode, baseExportDirectory, ExportFileName);
        }
        else
        {
            if (currentLevel < maxLevel)
            {
                nextNode = baseNode.AOTfirstChild();
                while (nextNode != null)
                {
                    this.GetAOLHelper(nextNode, baseExportDirectory, currentLevel + 1, maxLevel);
                    nextNode = nextNode.AOTnextSibling();
                }
                nextNode = null;
            }
        }
    }
}

该算法的症结如下:我想爬下 AOT 树(从特定节点开始)并导出任何作为“CUS”层对象的层。我在“maxlevel”停止爬下树,这意味着我只深入树 X 层。我目前仅在 AOT 树的“数据字典”节点上运行此算法。

我面临的问题是,当此作业运行时,AX32.exe 进程的内存占用量几乎为 1 GB。如果我对多个节点运行此代码,则内存需求会不断攀升。我很好奇为什么 AX 在算法完成后没有释放内存。我对 Google 的研究提出了一些与 AX 垃圾收集有关的问题。我想知道是否有办法在 AX 中强制进行垃圾收集?如果我尝试导出 AOT 中的每个节点,我会遇到前面提到的“内存不足”异常。在我关闭 AX32.exe 客户端之前,内存不会被释放。

4

1 回答 1

3

TreeNode 对象不像大多数其他对象那样被垃圾收集。你必须自己释放它。treeNodeRelease()当你完成一个节点时调用。

于 2013-03-07T15:30:44.433 回答