Outlook 2010 VSTO AddIn:UI随机冻结,同时异步向PST添加文件夹

时间:2016-01-21 07:15:18

标签: c# .net outlook vsto outlook-addin

我的C#VSTO Outlook 2010 AddIn以异步方式向导入的pst文件添加数百个MAPI文件夹。 (pst存在于Outlook foldertree中)

以下是一个例子:

Task.Factory.StartNew(() => {
    ... //get pstStore
    var rootFolder = pstStore.GetRootFolder();
    for (int i = 0; i < 500; i++)
    {
      var folder = rootFolder.Folders.Add("Test" + DateTime.Now.Ticks);
      Thread.SpinWait(1000); //emulate work
      Marshal.ReleaseComObject(folder);
    }
    Marshal.ReleaseComObject(rootFolder);
});

Outlook UI在rootFolder.Folders.Add(...)随机冻结2-3秒。有时在20之后,有时在50个文件夹之后。

非常感谢任何帮助/提示。

1 个答案:

答案 0 :(得分:2)

期望您的插件在Outlook 2013或更高版本中完全停止工作:一旦OOM检测到从主Outlook线程以外的线程调用它,就会引发错误。请注意,这仅适用于COM插件,因为它们在outlook.exe地址空间内运行。 COM系统总是将进程外访问封送到主Outlook线程(但这违背了从单独的线程使用OOM的全部目的)。

只能在辅助线程上使用扩展MAPI(C ++或Delphi)。如果使用Redemption是一个选项(它可以从包括C#在内的任何语言使用),则可以在辅助线程上使用其RDO family of objects:在主线程上存储Namespace.MAPIOBJECT属性的值(它是IMAPISession MAPI接口),然后在辅助线程上创建一个RDOSession对象的实例(将在该线程上初始化MAPI)并将RDOSession.MAPIOBJECT属性设置为存储在主线程上的值 - 这样两者将共享相同的MAPI会话。

脱离我的头顶:

listTemplate = Context.Web.ListTemplates.First(t => t.ListTemplateTypeKind == TemplateID);