Я хочу получить информацию с сервера Excachange (2010 через EWS API). Подробно я хочу создать службу Windows, чтобы перебирать всех пользователей excachange и индексировать их личные почтовые ящики с использованием имперсонализации. Это работает хорошо, но очень медленно, когда я делаю это для одного пользователя за другим (в зависимости от объема почтового ящика и количества пользователей). Скорость индексации сейчас около 500 элементов в минуту.
В моей тестовой системе следующие вызовы занимают около 250 миллисекунд:
PropertySet myPropertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.ParentFolderId);
myPropertySet.RequestedBodyType = BodyType.Text;
myPropertySet.Add(entryIdExtendedProperty);
Item item = Item.Bind(es, itemKey, myPropertySet);
Итак, моя идея состояла в том, чтобы сделать распараллеливание. Пока пробовал 3 способа:
Фоновый рабочий поток: один рабочий поток на пользователя. Результат: никакого эффекта. Кажется, что это замедлит сам вызов. В итоге общая скорость осталась прежней.
Отдельные EXE-процессы: один EXE-файл на пользователя. Я создал «Worker»-Exe и вызвал их с пользователем в качестве аргумента: IndexWorker.exe -user1
Результат: тот же результат! Вызовы каждого exe замедляются!Отдельные службы Windows: одна служба на пользователя. Результат: Внезапно запрос не тормозил, а значит я смог довести общую скорость до кратной 500 итемов в минуту (я триал до 3-х процессов, то есть 1500 итемов в минуту). Неплохо, но я оставляю меня наедине с вопросом:
Почему вызовы EWS замедляются в 1) и 2), но не в 3)? Потоки были бы для меня самым элегантным способом, есть ли какие-либо настройки или настройки, которые я могу использовать?
Я читал пару вещей о политиках регулирования и EWSFindCountLimit. Это правильное направление?