你如何防止不确定的进度条冻结?

时间:2010-10-27 19:29:53

标签: wpf multithreading progress-bar

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

4 个答案:

答案 0 :(得分:1)

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

一种常见的模式是使用BackgroundWorker作为后台任务 - 它使得将进度报告回UI线程变得特别容易。

答案 1 :(得分:1)

答案是使用一个单独的线程。我没有意识到我可以创建多个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;
}

答案 2 :(得分:0)

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

        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;                                                                     
                    }
                    ));
            }
        );

答案 3 :(得分:0)

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