Outlook interop打开太多项会导致错误

时间:2011-12-26 16:34:13

标签: c# interop outlook

我的目标是打开共享日历以进行分析和数据库跟踪。

关键是我设法打开这些项目,但几百后,我得到一个例外。 它解释了管理员(安全原因)限制了同时打开的项目的数量。

我能理解这一点所以我试着在阅读之后关闭每个项目。但我仍然得到错误。我正在阅读用户属性时出现问题。

以下是我的计划示例:

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();

关于如何正确关闭物品的任何想法?

2 个答案:

答案 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();