Performance - Microsoft.Office.Interop.Outlook.Items.Find()

本文关键字:Items Find Outlook Interop Microsoft Office Performance | 更新日期: 2023-09-27 18:18:37

我的公司有点担心从Outlook获取约会的以下两种方式之间可能存在性能差异:

private Microsoft.Office.Interop.Outlook.AppointmentItem FindeAppointment(DateTime startzeit, string subject)
{
    string filter = string.Format("[Start] = '{0}' AND [Subject] = '{1}' AND [BillingInformation] = 'TEST'", startzeit.ToShortDateString() + " " + startzeit.ToShortTimeString(), subject);
    MAPIFolder calendarFolder = outlookApplication.Session.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
    Items items = calendarFolder.Items;
    return items.Find(filter) as AppointmentItem;
}
private AppointmentItem FindeAppointment(DateTime startzeit, string subject)
{
    MAPIFolder calendarFolder = m_outlookApplication.Session.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    IEnumerable<AppointmentItem> items = calendarFolder.Items.OfType<AppointmentItem>();
    return items.FirstOrDefault(p => p.Start == startzeit &&
                                        p.Subject == subject &&
                                        p.BillingInformation == "TEST");
}

我们想用LINQ的方式来做,因为我们最近在过滤器上有一些问题,所以我们需要一个解决方案。

我不知道有什么好的方法来测试这些方法的性能,我不想创建成千上万的约会。

那么,谁有数据或者可以告诉我什么更快,或者至少,如何测试它?

或者我们应该不关心使用什么,因为它是一个非常低的速度差异?

Performance - Microsoft.Office.Interop.Outlook.Items.Find()

对OOM对象使用LINQ语句并不是一个真正的好主意。事实是底层COM对象没有被释放。如果您不及时释放这些对象,您可能会达到Exchange对每次打开的最大数量的限制。如果加载项试图枚举存储在Microsoft Exchange Server上的集合中的256个以上Outlook项目,这一点尤为重要。

使用System.Runtime.InteropServices.Marshal.ReleaseComObject来释放Outlook对象。然后在Visual Basic中设置一个变量为Nothing (c#中为null)来释放对对象的引用。在系统地释放对象文章中了解更多信息。

我还注意到你在一行代码中使用了多个点:

outlookApplication.Session.GetDefaultFolder

Application类的Session属性返回Namespace类的一个实例,该实例之后应该被释放。正如您可能看到的,在这种情况下,对象在被释放时没有控件。因此,我总是建议打破属性和方法调用链,并在单独的代码行中声明它们。

最后,Find/FindNext或Restrict方法不像LINQ那样将项加载到内存中。所以,它们会快得多。您可以在以下文章中阅读更多关于这些方法的信息:

  • 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
  • 如何:使用Restrict方法从文件夹
  • 中检索Outlook邮件项目
  • 在Outlook中编程高级搜索:c#, VB。净

这是一种推测,但如果我发现Outlook.Items.Find更糟糕,我一点也不会感到惊讶,因为它确实利用了Exchange中的索引,而不是将所有项放入内存并通过Linq迭代它们。

如何测试?

只有的方法来确定它得到一个有代表性的样本为您的环境和测试搜索两种方式。如果您的生产环境还不是很大,但是您"担心"它可能会变得很大,这可能意味着在测试Exchange环境中创建"数千个约会"。好消息是,您已经知道如何使用API,因此创建一堆随机约会应该不是什么大问题。:)