繁体   English   中英

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

[英]Outlook VSTO Crash And Ways to Reduce Memory Consumption

大家好我是Office插件编程的新手,现在我正在为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遍历所有电子邮件,并且消耗了大量内存?

我希望你们能对我有所帮助,因为我被这些东西困扰了很长时间。

首先,无法在Outlook插件的辅助线程上使用Outlook对象模型-从Outlook 2013开始,Outlook一旦检测到对辅助线程上的对象之一的访问,便会引发异常。 请注意,即使外部exe在第二个线程上使用OOM,外部exes也封送所有对主Outlook线程的OOM调用。 为了能够访问辅助线程上的各种Outlook对象,您需要使用扩展MAPI(C ++或Delphi)或像Redemption这样的包装器(它的RDO对象系列可以在辅助线程中使用 )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM