Я провожу небольшое исследование возможного применения 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) был очень быстрым.
Может кто-нибудь подтвердить это и, возможно, предложить какое-то решение для этого?
Конечно, я могу выполнять свою работу без использования смещения, но почему я должен? :)