Je suis en train d'écrire une application pour traiter les pièces jointes à un courrier électronique, à l'aide des services Web Exchange.Services Web Exchange: traitement groupé avec FindItemsResult <Item>
La structure générale de ma problématique est la suivante:
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;
}
Au début, cela avait l'air correct - il a traité mes exemples d'essais antérieurs parfaitement. Mais quand j'ai commencé à tester avec des charges en vrac, j'ai réalisé qu'il ne traitait que les 10 premiers éléments, puisque je spécifiais une taille de lot de 10 articles (ItemView view = new ItemView(10
)), mais je ne vérifiais pas d'autres lots.
je pouvais avoir simplement augmenté la taille du lot, mais un rapide Google plus tard, je trouve un meilleur exemple:
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;
}
Cette boucle à travers autant de courriels que je me soucie de jeter, mais pour des raisons que je ne peut pas encore comprendre, la boucle foreach ne traite maintenant que le premier élément de findResults.
Même si findResults contient plus d'un élément (findResults.Items.Count
> 1), avec mon deuxième exemple, findResults.MoreAvailable
= false. Assez juste, j'ai bouclé les lots plus tôt, il est donc logique que je regarde la fin du dernier lot.
Mais comment réinitialiser findResults pour traiter tout le lot? J'ai essayé de placer findResults.MoreAvailable mais c'est readonly ... Qu'est-ce que je manque?
CONCLUSION:
OK, donc je peux soit traiter les éléments d'un lot à la fois, ou je peux ajouter chaque élément dans chaque lot à une liste et de les traiter plus tard, comme je le fais actuellement.
Il n'y en a pas beaucoup entre eux; J'ai d'abord commencé à utiliser une liste, mais je vais considérer le choix plus loin.