C# Outlook互操作打开的项目太多会导致错误

C# Outlook互操作打开的项目太多会导致错误,c#,interop,outlook,C#,Interop,Outlook,我的目标是打开共享日历进行分析和数据库跟踪 关键是我设法打开了这些项目,但在几百次之后,我得到了一个异常。 它解释了管理员(出于安全原因)限制了simultenaous打开项目的数量 我能理解这一点,所以我在阅读后尝试关闭每一项。但我仍然得到了错误。当我读取用户属性时,问题出现了 以下是我的程序示例: Recipient recipient = mapiNamespace.CreateRecipient("John Doe"); if (recipient.Resolve()) { Ca

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

关键是我设法打开了这些项目,但在几百次之后,我得到了一个异常。 它解释了管理员(出于安全原因)限制了simultenaous打开项目的数量

我能理解这一点,所以我在阅读后尝试关闭每一项。但我仍然得到了错误。当我读取用户属性时,问题出现了

以下是我的程序示例:

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();
有没有关于如何正确关闭项目的想法?

我就是这样做的(以防有人通过此线程访问):


除了使用Masrhal.ReleaseCOMObject外,还应避免使用多点符号(例如item.UserProperties.Find)-编译器将为每个“.”创建一个隐式变量-不能显式释放此类变量

其次,不要使用“foreach”循环-它会一直引用所有集合元素,直到循环终止。使用“for”循环


第三,循环遍历文件夹中的所有项目总是一个糟糕的主意-使用MAPIFolder.GetTable。或者在Redemption:

中使用MAPITable对象,您需要在您接触的每个Outlook实例上调用Marshal.ReleaseComObject。在循环中调用它,直到它返回零。对,我必须强制释放每个项。System.Runtime.InteropServices.Marshal.ReleaseComObject(项);谢谢令人惊叹的。。很高兴我能帮忙。。请记住,COM对象或处理互操作时,在编组、调用和释放对象时是不同的。。我曾经用Delphi做过大量的COM,早在大约15年前我就知道了。。当您收到一个chancSignature被删除时,请向上投票,请参阅常见问题解答。我遇到了它,这是一个尝试的好主意,因为
ReleaseComObject
没有消除“打开的项目太多”错误消息。谢谢
System.Runtime.InteropServices.Marshal.ReleaseComObject(_calendar_item);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();