Я пишу приложение для обработки вложений электронной почты с помощью веб-служб Exchange.
Общая структура моей проблемной зоны следующая:
public static void Main()
{
FindItemsResults<Item> findResults = FindItems();
foreach (Item item in findResults)
{
DoSomethingWithItem(item);
}
}
public static FindItemsResults<Item> FindItems()
{
FindItemsResults<Item> findResults;
ItemView view = new ItemView(10); //batching 10 at a time
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
findResults = service.FindItems(
WellKnownFolderName.Inbox,
new SearchFilter.SearchFilterCollection(
LogicalOperator.Or,
new SearchFilter.ContainsSubstring(ItemSchema.Subject, Properties.Settings.Default.EmailSubject)),
view);
//return set of emails
return findResults;
}
Сначала это выглядело нормально - мои предыдущие тестовые примеры обрабатывались отлично. Но когда я начал тестирование с массовой загрузкой, я понял, что он обрабатывает только первые 10 элементов, так как я указывал размер партии из 10 элементов (ItemView view = new ItemView(10
)), но я не проверял наличие следующих партий.
Я мог бы просто увеличить размер пакета, но, посмотрев позже в Google, я нашел лучший пример:
public static FindItemsResults<Item> FindItems()
{
FindItemsResults<Item> findResults;
ItemView view = new ItemView(10, 0, OffsetBasePoint.Beginning);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
do
{
findResults = service.FindItems(
WellKnownFolderName.Inbox,
new SearchFilter.SearchFilterCollection(
LogicalOperator.Or,
new SearchFilter.ContainsSubstring(ItemSchema.Subject, Properties.Settings.Default.EmailSubject)),
view);
//any more batches?
if (findResults.NextPageOffset.HasValue)
{
view.Offset = findResults.NextPageOffset.Value;
}
}
while (findResults.MoreAvailable);
return findResults;
}
Это перебирает столько писем, сколько я хочу отправить, но по причинам, которые я пока не могу понять, цикл foreach теперь обрабатывает только первый элемент в findResults.
Хотя findResults содержит более одного элемента (findResults.Items.Count
> 1), во втором примере findResults.MoreAvailable
= false. Честно говоря, я просматривал партии ранее, так что имеет смысл, что я смотрю на конец последней партии.
Но как мне сбросить findResults, чтобы он обработал все? Я попытался установить findResults.MoreAvailable, но он доступен только для чтения ... Что мне не хватает?
ЗАКЛЮЧЕНИЕ:
Хорошо, поэтому я могу либо обрабатывать элементы по одной партии за раз, либо я могу добавить каждый элемент в каждой партии в список и обрабатывать их позже, как я это делаю сейчас.
Между ними нет ничего особенного; Сначала я начал использовать список, но позже рассмотрю выбор.