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

标签 c# wpf foreach window

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

我现在的问题是,带有进度条的状态窗口不会更新。 它似乎像我项目中的所有其他窗口一样只是“卡住”(我还让程序将它正在做的事情打印到控制台中)。

代码如下:

        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 辛姆森

最佳答案

阻塞 UI 线程会做到这一点......

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

因此,首先要做的是将您的加载移动到另一个线程上。 ThreadBackgroundWorkerTask 都是执行此操作的合理方法。然后,您需要将任何 UI 更改返回到 UI 线程。

如果您使用了 async(和 Tasks),那么框架会为您做这件事。同样,如果您使用适当的 MVVM 模式,PropertyChanged 事件将自动编码到正确的线程上。

如果您不能以“正确”的方式做到这一点,则可以使用 Dispatcher.BeginInvoke 自行编码此类更改。

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

但这只是一个创可贴。转向异步或基于 MVVM 的代码(或者更好的是,两者兼而有之!)

关于C# WPF 窗口在 foreach 循环中不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171169/

相关文章:

wpf - 在 WrapPanel 中共享可用空间

scala - foreach 中的泛型类型有何意义?

java - 如何在使用 Selenium 驱动程序执行 Foreach 循环时对其进行控制?

c# - 在整个文件中进行多行正则表达式搜索

c# - 当请求 xml 页面时提供 ashx 页面

c# - WPF RichTextBox - 选定的 block ?

r - 修复具有不同内核数的并行仿真运行的种子

c# - 使用 EPPlus 打开 excel 而不保存到文件

c# - 多线程BlockingCollection同值

c# - 可观察模型中的 IEnumerable