我的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个文件夹之后。
非常感谢任何帮助/提示。
答案 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);