发现我正在尝试根据数据库中的值以编程方式(使用Redemption)为用户的邮箱创建联系人。
RDOContactItem rci = (RDOContactItem)session.GetDefaultFolder(rdoDefaultFolders.olFolderContacts).Folders["Contacts Subfolder"].Items.Add("IPM.Contact");
...
rci.Save();
一旦达到限制250,我就会收到错误:
Error in IMsgStore::OpenEntry(Inbox or Root): MAPI_E_TOO_BIG
ulVersion: 0
Error: Your server administrator has limited the number of items you can open simultaneously. Try closing messages you have opened or removing attachments and images from unsent messages you are composing.
Component: Microsoft Exchange Information Store
阅读Dmitry Streblechenko对“这表明您有太多开放对象的说明。”您是否打开文件夹中的每条消息?关于http://www.microsoft-questions.com/microsoft/Plaform-SDK-Mapi/32731171/mapietoobig.aspx的建议甚至尝试了他的建议“你完成后会立即释放所有Exchange对象吗?”
if (rci != null) Marshal.ReleaseComObject(rci);
甚至转向IDisposable以便能够处理它,但它没有用。
保存后我找不到关闭联系人项目的方法。
增加可以在服务器端同时打开的项目数量也不是一个快乐的选择。
如何解决这个问题?
答案 0 :(得分:2)
您正在使用多点符号(如果我正确计数,则为5),这会导致编译器创建无法显式释放的隐式变量。请尝试以下方法。您也可以尝试每隔一段时间调用一次GC.Collect()
,但这将是一个解决方案的大锤......
RDOFolder contacts = session.GetDefaultFolder(rdoDefaultFolders.olFolderContacts);
RDOFolders folders = contacts.Folders;
RDOFolder subfolder = folders["Contacts Subfolder"];
RDOItems items = subfolder.Items;
RDOMail msg = items.Add("IPM.Contact");
RDOContactItem rci = (RDOContactItem)msg;
...
rci.Save();
Marshal.ReleaseComObject(rci);
Marshal.ReleaseComObject(msg);
Marshal.ReleaseComObject(items);
Marshal.ReleaseComObject(subfolder);
Marshal.ReleaseComObject(folders);
Marshal.ReleaseComObject(contacts);