Я пишу приложение для обработки вложений электронной почты с использованием веб-служб 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
= ложьЧестно говоря, я просматривал партии раньше, поэтому имеет смысл посмотреть на конец последней партии.
Но как мне сбросить findResults, чтобы он обрабатывал всю партию?Я попытался установить findResults.MoreAvailable, но он доступен только для чтения ... Чего мне не хватает?
ЗАКЛЮЧЕНИЕ:
ОК, так что я могу обработать элементы одним пакетом ввремя, или я могу добавить каждый элемент в каждом пакете в список и обработать их позже, как я делаю в настоящее время.
Между ними не так уж много;Первоначально я начал использовать Список, но я рассмотрю этот выбор дальше.