【问题标题】:How do you keep an indeterminate progress bar from freezing?如何防止不确定的进度条冻结?
【发布时间】:2010-10-27 19:29:52
【问题描述】:

一个不确定的进度条因为当然在同一个线程上而被冻结有什么好处?有没有办法让它继续运行?可能是多线程?

【问题讨论】:

  • 作为评论回答是因为我不确定是否在 WPF 中,但我认为有一个 BackgroundWorker 类将执行完成所有繁重工作并可以发送更新以更新进度条的进程。是的,多线程可能是做到这一点的唯一方法。顺便说一句,就像马拉松的个人资料图片;)
  • 编辑:中间 != 不确定
  • 实际上是 Aleph 一个,但谢谢。 :)
  • 够近了!该邮件列表仍然有效吗?很久没有签到了...
  • @Frustrated... 我只知道 trilogyrelease.bungie.org。

标签: wpf multithreading progress-bar


【解决方案1】:

线程几乎可以肯定是解决方案,是的 - 或异步操作。您绝对不应该在 UI 线程中执行长时间运行的任务。

一种常见的模式是将BackgroundWorker 用于后台任务——它使得向 UI 线程报告进度特别容易。

【讨论】:

  • BackgroundWorker 模式与我所需要的完全相反。我需要在备用线程中显示进度条。我不能只将我的流程包装在 BackgroundWorker 中,因为需要很长时间的不是我的东西。它的 WPF 布局需要时间。
  • @Jordan:首先解释一下会很有帮助。 可能您可以为整个单独的窗口创建一个新的 UI 线程 - 但在单个窗口中我认为您可能会遇到问题。
  • 这正是我想要做的。怎么样?
【解决方案2】:

答案是使用单独的线程。我没有意识到我可以创建多个 STA 线程。我创建了一个简单的委托线程气泡,每当我想隐藏进度窗口时都会弹出它。

protected void ShowProgress()
{
    if (_progressThread != null)
        return;

        _progressThread = new Thread(() =>
        {
            var progressShell = Program.ViewFactory.CreateDialogShell();
            progressShell.DataContext = new ProgressViewModel(this);
            progressShell.Show();

            Dispatcher.Run();
        });

        _progressThread.SetApartmentState(ApartmentState.STA);
        _progressThread.Start();
}

protected void HideProgress()

{
    if (_progressThread == null)
        return;

    _progressThread.Abort();
    _progressThread = null;
}

【讨论】:

  • 您需要在完成后通过调用 _progressThread 上的 Dispatcher.InvokeShutdown 来销毁该调度程序。假设 progressShell 是一个窗口,您可以在 Closing 或 Closed 事件中执行此操作。
  • 哇,这是很久以前的事了。今天,我将使用 a Task 和 async / await 将所有长任务与 UI 线程分开。
【解决方案3】:

我在这种情况下使用的代码

        ProgressIndicator.Visibility = System.Windows.Visibility.Visible;            

        ThreadPool.QueueUserWorkItem
        (
            delegate
            {
                // Perform slow action
                Thread.Sleep(5000);

                this.Dispatcher.Invoke(
                    new Action(delegate()
                    {                                    
                            // Insert UI related activity here.
                            // ....
                            ProgressIndicator.Visibility = System.Windows.Visibility.Collapsed;                                                                     
                    }
                    ));
            }
        );

【讨论】:

  • 慢动作不是我的。它的 WPF 布局需要永远。
  • 我没有遇到 WPF 布局缓慢的问题。我假设您有某种递归布局情况(或大量控件)。你能提供更多关于布局问题的信息吗?
  • 我有一个清单,上面有几百个需要放在ScrollViewer 中的东西。我不能使用虚拟化,因为查看器需要平滑滚动,因为这是一个触摸屏应用程序,并且虚拟化会强制整体滚动。
  • 有趣的问题,但您可能想在原始问题中添加一些细节。
【解决方案4】:

不确定您的问题的详细信息,但我有一个类似的问题(也许?),我有一个 ListView 需要显示许多(数百个)缩略图。缩略图是从文件系统上的数码照片生成的,因此创建许多缩略图会在加载时锁定 UI。我使用占位符图像(带有字符串“正在加载...”的小 JPG)和足够的数据创建了 ListView 中的所有对象,以便后台工作人员随后 更新 中的每个对象带有缩略图的 ListView,可能还有来自文件的其他数据(占位符对象的数据来自简单的数据库查询)。用户在加载时获得响应式 UI。这很有效,因为加载数百个对象的占位符数据足够快(几秒钟),而对于非常大的数据集可能需要几分钟。我对您的情况了解得不够多,不知道这是否可行...

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多