c# - 使用 VSTO 将数据加载到 Microsoft Project 时如何提高性能

标签 c# vsto ms-project

背景

我们有一个现有的应用程序,可以将数据加载到 Microsoft Project 中,以便 MS Project 对其进行操作。

原来的应用是针对MS Project 2003/2007的VB6编写的老式COM Project插件,现在我们计划将它们迁移到针对MS Project 2013/2016的VSTO插件。

问题

对于他们的 COM 插件解决方案,我们遇到了性能问题:

Testing project has 4414 activities (av_activity table) and 8330 relationships (av_reln table).

Performance issues were reported during Load operation:

Load time on MSP 2003 template for above project is apprx: 30-35 mins.

Load time on MSP 2007 & 2010 template is > 3hrs

对于 VSTO 解决方案,它变得更好,但我们仍然希望可以通过某种方式提高加载性能。

到目前为止我们尝试了什么

我们尝试了几种技巧,但没有取得太大效果......

  • 添加数据时禁用自动计算

    _application.Calculation = PjCalculation.pjManual;

  • 添加数据时禁用屏幕更新

    _application.ScreenUpdating = false;

  • 禁用更改突出显示

    _application.EnableChangeHighlighting = false;

  • 禁用状态栏

    _application.DisplayStatusBar = false;

  • 将撤消值设置为 1

  • 将默认 View 设置为“任务 TableView ”(而不是“甘特图 View ”,后者在加载期间会产生更多开销)。

寻求帮助

我正在寻求有关在使用 VSTO 插件和 C# 将数据加载到 MS Project 时提高性能的任何解决方案的帮助。

提前致谢!

最佳答案

是的,使用 TaskDependencies.Add创建关系的方法极其缓慢。

这很不幸,因为这是合乎逻辑的使用方法。 唯一的解决方法是提前构建 Predecessor 列表。获得该列表后,您可以通过两种方式创建关系:

  • 添加到现有时间表
  • 通过导入包含前任列表的任务数据来创建新计划

由于您的数据已经是表格形式,因此使用项目导入向导从 csv 或 Excel 文件导入数据效果非常好。 要使用项目导入向导,请选择要从 MS Project 中打开的 csv 或 Excel 文件(文件 -> 打开)。该向导将引导您完成创建导入映射的步骤,您可以将其保存以供以后自动化使用。 在您的导入数据中包含 Predecessors 列,向导将在几秒钟内为您创建关系。

任务Predecessors field包含以逗号分隔的前任列表。每个前导的格式如下:

  • 任务编号
  • 关系类型(FS、FF、SS、SF)
  • 延迟(+/- #d)

具有 FS 类型且没有滞后的前置任务仅显示任务 ID。以下是前置字段值的一些示例:

  • 14,126,127
  • 73,92SS
  • 144FS+3d,145

如何从关系表创建前置字段值

假设一个关系表,其中包含前任和继任者的任务 ID:

  1. 创建一个包含整数键(后续任务 ID)和字符串值(前置任务)的字典。
  2. 遍历关系表,将继任者的任务ID及其前任添加到字典中;如果它已经存在,更新值以附加一个逗号和前导。
  3. 遍历字典并 A) 更新 csv 文件中的前任列 B) 在计划中的后续任务上设置前任字段。

关于c# - 使用 VSTO 将数据加载到 Microsoft Project 时如何提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829652/

相关文章:

c# - 根据达到 1 所需的 Collat​​z 猜想循环次数找到一个数字

c# - 此插件导致 Outlook 启动缓慢

c# - 当我们只知道窗口句柄时如何获取窗口图像

c# - ContentControl 的格式泄露到控制之外

c# - 在 Excel 中禁用复制(ctrl+c)、粘贴(ctrl+v)、剪切(ctrl+x)

c# - 获取 MS Project 文件的显示字段

c# - ms 项目中的 Task.Duration 属性

C# MS Project Interop - 获取资源的工作时间

c# - 比较 2 个 XML 文档并将更改应用到源文档

c# - 如何对网格中的所有文本 block 使用相同的比例变换