当后台线程加载UI时,WPF主线程冻结

时间:2014-06-17 06:47:32

标签: c# wpf multithreading dispatcher

我希望在我的应用程序创建复杂屏幕时显示进度条。我的代码是:

protected override void LoadSubject(object sender)
    {
        var win = new Spinner();

        win.Show();

        Thread th = new Thread(() =>
        {
            LoadSubjectImpl(sender);

            win.Dispatcher.BeginInvoke(new Action(() => win.Close()));
        });

        th.Start();
    }

  private void LoadSubjectImpl(object sender)
    {
        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                StartServiceWorkflow(sender);
            })
            );
    }

它的工作正常,但进度条冻结...... 我必须在后台线程中使用调度程序,因为“InvalidOperationException”并且我认为这个问题,但我该怎么办?

  • spinner = costum progressbar。

1 个答案:

答案 0 :(得分:3)

你没有运气试图实现你所描述的。如果您仔细阅读InvalidOperationException,您就会知道无法从后台线程操作UI。您使用Dispatcher所做的是将StartServiceWorkflow同步到UI线程。所以你的代码正在执行 - 导致冻结。

要实现一些用户体验增强,您可以委派后台线程任务,如读取表单数据库或处理要显示的数据。