私は、共有 Outlook メールボックスを見て、フォルダーを収集し、TabControl に TabItems を作成してフォルダーを表し、過去 14 日間のフォルダーで見つかった MailItems を収集する WPF サポート ツールに取り組んでいます。各フォルダーにはおそらく数十個のメールアイテムしかないため、一気に大量になることはありません。
起動時に、アプリケーションは各フォルダの Mailitem を繰り返し処理し、後でそれぞれの TabItem の ListBox のバインドされた ObservableCollection に追加する MailItem List にそれらを追加します。
私が抱えている問題は、Outlook フォルダー内の MailItems を反復処理するときに UI がロックすることです。最初にバックグラウンドでメールを収集するように Backgroundworker ルーチンを追加しましたが、この間、UI はまだ完全に応答しません。このプロセスがUIをまったくいじっていないので、その理由がわかりません。
以下の私の簡略化されたコード。この例では、MailItems を反復処理する以外に実際には何もしていませんが、UI がフリーズします。なんで?また、合計で約 10 個の Outlook フォルダーがあることにも注意してください。TabItem (コンテンツとして ListBox を含む) が作成され、フォルダーを表すため、以下のコードが起動されます。つまり、初期化プロセス中に約 10 の Backgroundworker が起動するはずです。
これをより適切に実装するための提案やアイデアはありますか? 理想的には、アプリが起動してスムーズにディスプレイに表示され、ハングして突然すべてが表示されるのではありません。
List<MailItem> mailList = new List<MailItem>();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(delegate
{
Items folderItems = folder.Items.Restrict(filter);
foreach (MailItem mi in folderItems.OfType<MailItem>())
{
// would normally add to mailList here.
}
});
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate
{
// then add to the ObservableCollection of the UI ListBox.
});
worker.RunWorkerAsync();
worker.Dispose();