【问题标题】:VSTO: MS Project - Calculating the ID for child tasks performance issues/workaroundVSTO:MS Project - 计算子任务性能问题/解决方法的 ID
【发布时间】:2012-12-06 15:10:59
【问题描述】:

我有一个包含任务列表的数据库。我正在使用 VSTO 从该数据库中读取数据并从中创建一个新的 Microsoft Project。任务上限为 3000。

问题是数据库中的记录是随机顺序的。当然,它们在同一个表中以主外键的形式定义了父子关系。但是,有两个限制:

  1. 我必须一口气读完所有记录。
  2. 读取记录的顺序可以是完全随机的。

第二个问题是真正的问题发生的地方。因为我很可能首先获得所有 OutlineLevel = 1 记录,然后是一些 OutlineLevel = 5 记录,然后是一些 Outline Level = 2 等等(完全随机)。

由于 VSTO API 在执行 ParentTask.OutlineChildren.Add(<Task>) 的意义上是奇怪的,将创建该父级的子任务,但会将任务添加到网格的最后一行!

这迫使我为遇到的每条记录重新计算 ID。对于ID,我的意思是MS Project 中必须记录的行号

问题在于,如果我为 3000 个任务重新计算它,它会变得越来越慢。一开始,它每秒可以插入 30-40 个任务,但 处理所有 3000 个任务需要 11 个小时! (这当然是不可接受的)。

是否有一些 API 方法可以快速完成此操作?或者是否有另一种方法可以重新计算子任务的 ID。

  • 计算子任务 ID 的代码是迭代的。它从父任务的 ID 开始,并尝试根据子任务的兄弟编号计算子任务将具有的 ID(SiblingNumber 存储在我构建的数据结构中,它充当包装 MSProject.Task object)。

【问题讨论】:

  • 如果您的更新以 30 个任务/秒开始并且需要 11 小时而不是 2 分钟(30/秒 * 60 秒 = 1800/分钟) - 请确保您发布指向 COM 对象和集合的链接.因此,项目变得非常缓慢。如果您使用 Application.Projects[1].Tasks[1].Name 之类的集合 - 您将启动 4 个对 COM 对象的引用:Projects 集合、Project、Tasks 集合和 Task。所有这些都需要重复使用或发布。

标签: vsto ms-office ms-project


【解决方案1】:

解决问题的最简单方法是在Task.OutlineChildren 中列出的第一个任务之前插入一个子任务。但它只有在已经有一些子任务时才有效。

下一个足够快的解决方案是将项目结构读入附加组件中的某个数据结构并对其进行扫描,而不是每次都调用 COM。当您更改项目时,我只需要自己更新结构即可。

当然,如果您只想在其兄弟姐妹列表的末尾插入几个任务,您可以扫描下一个具有与其父级相同 OutlineLevel 的任务,并在该任务之前插入。

但无论如何,在批量插入/更新时缓存项目结构是最合理的解决方案。

【讨论】:

  • "解决问题的最简单方法是在 Task.OutlineChildren 中列出的第一个任务之前插入一个子任务。但只有在已经有一些子任务时才有效。"假设我的一个任务在 ID 3 和 4 有 2 个子任务。我希望能够在它们之间插入一个任务。在Task.OutlineChildren的第一个任务之前插入如何解决这个问题?
  • 它没有,它只有在你不关心任务的顺序并且你可以在任务#3之前插入任务时才有效。
【解决方案2】:

COM 接口很慢,所以最重要的是在自己的代码中尽可能多地进行处理,并且只有在获得按行顺序排列的任务列表后,才能将它们插入到 Project 中。

至于实际的算法,我会创建一个树形结构,当您浏览数据库时,我会创建一个新节点,不仅用于读取的任务,还用于其隐含的父节点(如果尚未遇到)。所以:

读取每条记录并: 查看父级是否已经存在(为此使用字典)。 如果没有,请创建它(并添加到字典中)。 查看任务是否已经存在(为此使用相同的字典)。 如果没有,请创建它(并添加到字典中)。 将任务添加到父级的子级列表中。

(首先创建一个顶级任务可能更优雅,然后将任何没有父级的任务作为该顶级级的子级。)

完成后,以深度优先的方式遍历树,任务按行顺序排列。

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多