我正在研究WPF支持工具,該工具查看共享Outlook郵箱,收集文件夾,在TabControl中創建TabItems以表示文件夾,然後收集它找到的MailItems在過去14天的文件夾中。每個文件夾可能只有大約十幾個MailItems,所以在任何時候都不會有大量的MailItem。Backgroundworker允許用戶界面在迭代時通過Outlook郵件項目凍結
啓動時,應用程序遍歷每個文件夾的郵件並將它們添加到MailItem列表中,稍後我將其添加到相應TabItem的列表框的綁定ObservableCollection中。
我遇到的問題是UI鎖定,因爲它遍歷Outlook文件夾中的MailItems。我添加了Backgroundworker例程來首先在後臺收集郵件,但在此期間UI仍然完全沒有響應。我不明白爲什麼這個過程不會搞亂用戶界面。
我的簡體代碼如下。請注意,除了在此示例中遍歷它們之外,我實際上並沒有對MailItem執行任何操作,但凍結了UI。爲什麼?還值得注意的是,總共有大約10個Outlook文件夾。一個TabItem(以ListBox作爲內容)被創建來表示一個文件夾,並因此會導致下面的代碼啓動 - 換句話說,在初始化過程中應該有大約10個Backgroundworkers啓動。
任何建議或想法,以更好地實施?理想情況下,我希望應用程序啓動並順利地填充顯示,而不是掛起並突然顯示所有內容。
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();
如果您已經在使用Backgorundworker,請嘗試使用.WhenAny或IProgress以異步方式更新您的Windows。這裏的關鍵字是[TAP](https://msdn.microsoft.com/en-us/library/hh873175.aspx)(基於任務的異步模式)。還要提防你的foreach mi循環中的創建引用 – ivo 2016-06-27 07:17:11