我正在对我们现有项目中可能的EWS应用进行一些研究,该项目是在大量使用MAPI编写的,我发现了一些令人不安的关于LoadPropertiesForItems()方法性能的内容。
考虑这种情况:
所以,代码看起来像这样:
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)非常快。
任何人都可以确认并为此提出一些解决方案吗?
当然,我可以在不使用偏移量的情况下完成工作,但为什么要这样做呢? :)
答案 0 :(得分:2)
更改偏移量是很昂贵的,因为服务器必须从头开始遍历项目 - 不可能有消息的序数索引,因为新消息可以按任何顺序插入到视图中(想想一下查看名称或主题)。
对所有项目进行一次分页是最好的方法。