C#WPF窗口不在foreach循环中更新

时间:2015-07-01 20:36:11

标签: c# wpf foreach window

在我的项目中我需要加载“项目”。 我在foreach循环中加载所有这些“项目”。 在这个foreach循环中,我想显示一个带有进度条的状态窗口,每当新项目加载时它都会更新。

我现在的问题是,带有progrssbar的状态窗口不会更新。 它似乎只是像我项目中的所有其他窗口一样“冻结”(我还让程序将它正在进行的操作打印到控制台中)。

以下是代码:

        Status StatusWd = new Status();
        StatusWd.pb_Status.Maximum = animes.Length;
        StatusWd.SetStatusText("Animes in AnimeBibliothek laden...");
        StatusWd.Show();

        bool white = false;
        bool black = true;
        foreach (string anime in animes)
        {
            if (white)
            {
                //Not working..
                AB_Output.WriteLine(GetTime() + "Weißes User Control laden...");
                AddWhiteUcpToStk(anime);
                white = false;
                black = true;
            }                
            else if (black)
            {
                AB_Output.WriteLine(GetTime() + "Schwarzes User Control laden...(" + anime + ")");
                AddBlackUCPToStk(anime);
                //white = true;
                //black = false;
            }
            StatusWd.pb_Status.Value = Array.IndexOf(animes, anime);
        }
        StatusWd.Close();    

这不仅仅是不会更新的进度条。此外,窗口中的标签会在值更改时更新,不会更改。我对它进行了调整,并且进度条的值发生了变化,标签内容也发生了变化......

如果你能解释一下你的解决方案,那就太好了。

LG Sinmson

1 个答案:

答案 0 :(得分:3)

阻止UI线程会这样做....

任何时间你正在运行一个长时间的操作,你需要确保它在某个其他线程上,否则你将被视为"无响应"。

所以,首先要将你的加载移动到另一个线程上。 ThreadBackgroundWorkerTask都是合理的方法。然后,您需要将任何UI更改返回封送到UI线程。

如果您使用async(和Tasks),那么框架会为您执行此操作。同样,如果您使用正确的MVVM模式PropertyChanged,事件将自动封送到正确的线程上。

如果你做不到,那就是"对"然后,使用Dispatcher.BeginInvoke自行编组此类更改。

Dispatcher.BeginInvoke(new Action(() =>
{
    //UI code ONLY
}), DispatcherPriority.Normal);

但这只是作为创可贴。转向基于异步或MVVM的代码(甚至更好,都是!)