Exchange Webservices托管API - 使用ItemView.Offset for FindItems()命中LoadPropertiesForItems方法的性能

时间:2011-04-11 13:36:55

标签: exchangewebservices

我正在对我们现有项目中可能的EWS应用进行一些研究,该项目是在大量使用MAPI编写的,我发现了一些令人不安的关于LoadPropertiesForItems()方法性能的内容。

考虑这种情况:

  • 我们在收件箱文件夹中有10000(一万条)消息
  • 我们希望获得每条消息的大约30个属性,以确定它们是否满足我们的进一步处理条件
  • 邮件以100封邮件包的形式从服务器中检索

所以,代码看起来像这样:

        ItemView itemsView = new ItemView(100);

        PropertySet properties = new PropertySet();
        properties.Add(EmailMessageSchema.From);
        /*
        add all necessary properties...
        */
        properties.Add(EmailMessageSchema.Sensitivity);

        FindItemsResults<Item> findResults;
        List<EmailMessage> list = new List<EmailMessage>();

        do
        {
            findResults = folder.FindItems(itemsView);                
            _service.LoadPropertiesForItems(findResults, properties);

            foreach (Item it in findResults)
            {
                ... do something with every items
            }

            if (findResults.NextPageOffset.HasValue)
            {
                itemsView.Offset = findResults.NextPageOffset.Value;
            }

        }while(findResults.MoreAvailable);

问题是itemsView.Offset属性的每个增量都使得LoadPropertiesForItems方法的执行时间更长。对于前几次迭代,它不是很明显,但是大约第30次循环使得呼叫时间从不到1秒增加到8秒或更多秒。并且内存分配达到物理限制,导致内存不足异常。

我很确定我的问题是“偏移相关的”,因为我将代码改为一点:

        itemsView = new ItemView(100, offset, OffsetBasePoint.Beginning);
        ...rest of loop
        if (findResults.NextPageOffset.HasValue)
        {
            offset = findResults.NextPageOffset.Value;
        }

我操作偏移量变量(在循环外声明),这样我在开始时将其值设置为4500,而在第一次迭代后将其值设置为调试模式我将其值更改为100.并根据我的怀疑首先调用LoadPropertiesForItems花了很长时间执行,第二次调用(偏移= 100)非常快。

任何人都可以确认并为此提出一些解决方案吗?

当然,我可以在不使用偏移量的情况下完成工作,但为什么要这样做呢? :)

1 个答案:

答案 0 :(得分:2)

更改偏移量是很昂贵的,因为服务器必须从头开始遍历项目 - 不可能有消息的序数索引,因为新消息可以按任何顺序插入到视图中(想想一下查看名称或主题)。

对所有项目进行一次分页是最好的方法。