我正在研究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