无响应的显示对话框窗口

时间:2017-07-13 09:14:36

标签: c# wpf

我正在向我的后台工作人员显示一个模态对话框,但是当对完成的工作线程事件完成一些长任务时,它会变得无法响应。有人能告诉我它为什么会发生这种情况以及如何解决这个问题吗?

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    var back = new BackgroundWorker();
    back.DoWork += delegate
    {
        int i = 0;
        while (i < 100)
        {
            Thread.Sleep(100);
            i++;
        }
    };

    back.RunWorkerCompleted += delegate
    {
        //running  along task on UI therad

        int i = 0;
            while (i < 10000)
            {

                int j = 0;
                while (j<10000)
                {

                    label.Content = i.ToString();
                    j++;
                }

                i++;
            }
        msgbox.Close();
    };

    back.RunWorkerAsync();

    msgbox.Title = "loading";
    msgbox.Owner = this;
    msgbox.ShowDialog();
}

2 个答案:

答案 0 :(得分:1)

无法在UI线程上运行任何长时间运行的方法而不会阻止它。单个线程不能同时执行while循环并同时响应用户输入。这是不可能的。

这就是为什么你应该在后台执行任何长时间运行的方法,即在这种情况下在DoWork事件处理程序中。

RunWorkerCompleted事件处理程序应仅执行一些与UI相关的快速任务,例如更新标签或类似内容。不要在那里做任何重要事情,因为那时你阻止UI线程,你的应用程序无法响应。

答案 1 :(得分:0)

这部分在UI线程中执行:

    back.RunWorkerCompleted += delegate
    {
        //running  UI therad

        int i = 0;
        while (i < 100)
        {

            Thread.Sleep(100);
            label.Content = i.ToString();
            i++;
        }

        msgbox.Close();
    };

当您调用Thread.Sleep(100);时,您将整个UI线程置于睡眠状态。这意味着你的用户界面会睡10秒钟。