2013-02-11 60 views
0

我正在研究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(); 
+0

如果您已经在使用Backgorundworker,请尝试使用.WhenAny或IProgress以异步方式更新您的Windows。这里的关键字是[TAP](https://msdn.microsoft.com/en-us/library/hh873175.aspx)(基于任务的异步模式)。还要提防你的foreach mi循环中的创建引用 – ivo 2016-06-27 07:17:11

回答

-1

我不知道这是否是引起你的用户界面死机,但RunWorkerAsync之后你不应该调用一个BackgroundWorkerDispose如将运行在大致相同的时间DoWorkRunWorkerCompleted之前。您可以在RunWorkerCompleted处理程序中调用Dispose(我更喜欢这样做,因为它将所有内容都保存在一个位置),或保存工作人员,稍后在处理包含的类时再执行此操作。