Outlook VSTO崩溃和减少内存消耗的方法

时间:2016-09-23 13:08:07

标签: c# outlook-addin

Hey Guys我是办公室插件编程的新手,现在我正在为outlook创建一个插件。此Outlook插件的目的是获取每个帐户的收件箱中的所有传入邮件,并将它们发送到我的服务器。 我已成功完成了Microsoft.Office.Interop.Outlook ,但我遇到了一些问题。这是我的代码http://pastebin.com/TwnmrYeY,以下是问题

  1. 据我所知,在主UI线程中无法完成工作,所以我创建了另一个从主线程单独运行的线程。我循环AccessEmails函数来获取新的传入邮件,因为如果有一堆传入邮件,ItemsEvents_ItemAddEventHandler无法处理它。 问题是后台线程有时在Outlook已经关闭时不会停止。
  2. 我想在获取所有电子邮件之前等待同步发送/接收完成,我尝试使用Application.Session.SyncObjects并为SyncStart,SyncEnd和OnError添加事件处理程序,但它仍然经常崩溃。 当同步正在进行但我关闭Outlook应用程序时会发生崩溃。
  3. 如何在收件箱中迭代所有电子邮件时减少内存消耗,我使用Outlook.Items来迭代所有电子邮件并消耗相当大的回忆?
  4. 我希望你们可以帮助我,因为我已经被这些东西长时间困住了。

1 个答案:

答案 0 :(得分:0)

首先,Outlook对象模型不能在Outlook插件中的辅助线程上使用 - 从Outlook 2013开始,一旦检测到对辅助线程上的某个对象的访问,Outlook就会引发异常。请注意,即使在辅助线程上使用该exe OOM,外部exes也会封送所有对主Outlook线程的OOM调用。为了能够访问辅助线程上的各种Outlook obejcts,您需要使用扩展MAPI(C ++或Delphi)或类似Redemption的包装器(其RDO对象系列can be used in secondary threads )。

其次,虽然Application.Quit事件通常不会触发,但您仍然可以检测到最后一个Explorer或Inspector关闭(Explorer.Close nad Inspector.Close事件) - 一旦上一个Outlook窗口关闭,Outlook将退出。这也可以帮助防止Outlook退出:如果您对Inspector或Explorer对象的引用(即使它不可见),Outlook将保持运行。