【问题标题】:C# WPF Window not Updating in foreach loopC# WPF 窗口未在 foreach 循环中更新
【发布时间】:2015-07-02 04:43:12
【问题描述】:

在我的项目中,我需要加载“项目”。 我在 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 和您的工作在同一个线程上运行。您应该编写异步加载方法来加载您的项目。如果没有看到阅读您的项目的逻辑,我无法提供使其异步的建议,但是,您可以使用 async、await 和 TPL 来实现它。

标签: c# wpf foreach window


【解决方案1】:

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

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

所以,第一件事是将您的加载转移到另一个线程上。 ThreadBackgroundWorkerTask 都是合理的方法。然后您需要将所有 UI 更改编组返回到 UI 线程。

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

如果您不能以“正确”的方式进行操作,请使用 Dispatcher.BeginInvoke 自己编组此类更改。

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

但这样做只是作为一种创可贴。转向异步或基于 MVVM 的代码(甚至更好,两者兼有!)

【讨论】:

  • 谢谢,我会读一些关于 backgroundworker 的内容。你更喜欢“一直”使用后台工作程序还是只在它不冻结 gui 时使用?
  • @Sinmson 线程我确保使用长操作。话虽如此,您应该始终将您的业务逻辑(像这样)从 UI 中分离出来,因此无论如何正确的设计通常都不是问题。请注意BackgroundWorker 有点过时了。您可能想先尝试Task
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多