【问题标题】:Saving MailItem as msg using SaveAs causes Outlook lag使用 SaveAs 将 MailItem 保存为 msg 会导致 Outlook 滞后
【发布时间】:2018-07-13 04:57:25
【问题描述】:

我正在编写需要将某些项目保存为 msg 文件的 VSTO Outlook 加载项。问题是,每次我调用 MailItem.SaveAs 时,它都会导致 Outlook 稍微滞后并显示处理光标(蓝色圆圈)。 我已经尝试将它移动到一个单独的线程中,但这并没有帮助。 保存项目非常快(大部分时间不到 100 毫秒),但仍然会导致这种烦人的行为。 我需要保存一个项目以将其读取为 MSG 格式,所以如果我可以直接执行此操作会更好,但正如我在这里找到的: Outlook MailItem as Stream 唯一的解决方案似乎为此使用 EWS。还有其他选择吗?

也许在这种情况下使用 RDO 会有所帮助? 据我了解,另一种选择是从邮件项目属性手动创建 msg。但也许有更简单的方法?

【问题讨论】:

  • 您尝试过使用 RDO 吗?它可以在辅助线程上使用。
  • 是的,我正在考虑。会试一试的。
  • 从 Outlook MailItem 创建 Redemption SafeMailItem 并保存它似乎有帮助。但我有一些问题。在使用项目集创建 SafeMailItem 之后为项目调用 Marshal.ReleaseComObject 是否安全?它是否包含任何引用或只是复制数据?保存的消息与我从 Outlook 获得的消息略有不同。例如,对于主题为空的消息,它会在主题中显示 [UNREGISTERED]。
  • 是的,Marshal.ReleaseComObject 是安全的 - 它只是确保立即释放 COIM 对象,而不是稍后在 GC 线程上释放。[UNREGISTERED] 由开发版本添加 - 它不存在于可分发版本。

标签: outlook vsto mapi outlook-redemption


【解决方案1】:

与 OOM 不同,Outlook 所基于的低级 API(扩展 MAPI)支持多线程。因此,您可以在辅助线程上运行代码,而不会对 Outlook UI 产生任何明显影响。请参阅INFO: Save Message to MSG Compound File 了解更多信息。

您也可以考虑在扩展 MAPI 周围使用第三方包装器,例如 Redemption。

【讨论】:

  • 谢谢!因此,如果我使用这样的函数创建 dll,我可以从 OOM 传递 MAPIOBJECT,它可能会起作用吗?或者尝试在 C# 中重现它。我也在考虑 Redemption,但我们有严格的安全规则,所以尽量使用最少的外部闭源库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2019-11-13
  • 2020-06-08
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多