我的目标是打开共享日历以进行分析和数据库跟踪。
关键是我设法打开这些项目,但几百后,我得到一个例外。 它解释了管理员(安全原因)限制了同时打开的项目的数量。
我能理解这一点所以我试着在阅读之后关闭每个项目。但我仍然得到错误。我正在阅读用户属性时出现问题。
以下是我的计划示例:
Recipient recipient = mapiNamespace.CreateRecipient("John Doe");
if (recipient.Resolve())
{
CalendarFolder = mapiNamespace.GetSharedDefaultFolder(recipient, OlDefaultFolders.olFolderCalendar);
outlookCalendarItems = CalendarFolder.Items;
outlookCalendarItems.IncludeRecurrences = false;
}
else
{
Console.Write("Failed to open Calendar");
return;
}
foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems)
{
Console.WriteLine(item.Subject + " -> " + item.Start.ToLongDateString()); //=> Ok, no problem
UserProperty up = item.UserProperties.Find("Test"); //=> Problem if too many items
if( up!= null )
{
Console.Write("UserProperty Value: " + up.Value);
}
((Microsoft.Office.Interop.Outlook._AppointmentItem)item).Close(OlInspectorClose.olDiscard); //=> Problem if too many items
Console.WriteLine();
}
Console.ReadKey();
关于如何正确关闭物品的任何想法?
答案 0 :(得分:2)
除了使用Masrhal.ReleaseCOMObject之外,还应该避免使用多点符号(例如item.UserProperties.Find) - 编译器将为每个“。”创建一个隐式变量。 - 你不能明确地释放这些变量。
其次,不要使用“foreach”循环 - 它会保留所有引用的集合元素,直到循环终止。使用“for”循环。
第三,循环浏览文件夹中的所有项目总是一个糟糕的主意 - 使用MAPIFolder.GetTable。或者在Redemption中使用MAPITable对象:http://www.dimastr.com/redemption/mapitable.htm
答案 1 :(得分:1)
这就是我做的方式(以防万一有人遇到这个帖子):
System.Runtime.InteropServices.Marshal.ReleaseComObject(_calendar_item);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();