【问题标题】:Backgroundworker allowing UI to freeze when iterating through Outlook MailItemsBackgroundworker 允许 UI 在遍历 Outlook MailItems 时冻结
【发布时间】:2013-01-27 04:49:52
【问题描述】:

我正在开发一个 WPF 支持工具,该工具查看共享的 Outlook 邮箱,收集文件夹,在 TabControl 中创建 TabItems 来表示文件夹,然后收集它在过去 14 天的文件夹中找到的 MailItems。每个文件夹可能只有大约十几个 MailItems,所以数量并不多。

在启动时,应用程序会遍历每个文件夹的 Mailitems 并将它们添加到 MailItem 列表中,稍后我将添加到相应 TabItem 的 ListBox 的绑定 ObservableCollection 中。

我遇到的问题是 UI 在遍历 Outlook 文件夹中的 MailItems 时会锁定。我添加了一个 Backgroundworker 例程来首先在后台收集邮件,但在此期间 UI 仍然完全没有响应。我不明白为什么这个过程根本不会影响 UI。

下面是我的简化代码。请注意,除了在此示例中遍历它们之外,我实际上对 MailItems 没有做任何事情,但它冻结了 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 来异步更新您的窗口。这里的关键字是TAP(基于任务的异步模式)。还要注意在你的 foreach mi 循环中创建引用

标签: c# wpf outlook backgroundworker mailitem


【解决方案1】:

我不确定这是否会导致您的 UI 锁定,但您不应该在 BackgroundWorker 之后立即在 RunWorkerAsync 上调用 Dispose,因为这将与 DoWork 和在RunWorkerCompleted 之前。您可以在 RunWorkerCompleted 处理程序中调用 Dispose(我更喜欢这样做,因为它将所有内容都保存在一个地方)或保存工作人员并在稍后释放包含类时执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多