Exchange Web サービスを使用して、電子メールの添付ファイルを処理するアプリを作成しています。
私の問題領域の一般的な構造は次のとおりです。
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
それ以上のバッチをチェックしていませんでした。
単純にバッチサイズを大きくすることもできましたが、後で簡単にグーグルで検索すると、より良い例が見つかりました。
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) が含まれていますが、2 番目の例ではfindResults.MoreAvailable
= false です。当然のことながら、以前にバッチをループ処理したので、最後のバッチの最後を見ているのは理にかなっています。
しかし、findResults をリセットしてすべてを処理するにはどうすればよいでしょうか。findResults.MoreAvailable を設定しようとしましたが、読み取り専用です...何が欠けていますか?
結論:
では、アイテムを一度に 1 バッチずつ処理するか、現在行っているように、各バッチの各アイテムを List に追加して後で処理することができます。
それらの間には多くはありません。最初はリストを使い始めましたが、選択をさらに検討します。