-1

私は、共有 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();
4

1 に答える 1

-1

これが UI のロックアップの原因かどうかはわかりませんが、 とほぼ同時に実行されるDisposeため、BackgroundWorker直後に呼び出すべきではありません。ハンドラーで呼び出すことができます(すべてを 1 か所に保持するため、これを好みます)、ワーカーを保存して、後で含まれているクラスが破棄されたときにそれを実行します。RunWorkerAsyncDoWorkRunWorkerCompletedDisposeRunWorkerCompleted

于 2013-02-12T02:49:12.690 に答える