在我的项目中我需要加载“项目”。 我在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
答案 0 :(得分:3)
阻止UI线程会这样做....
任何时间你正在运行一个长时间的操作,你需要确保它在某个其他线程上,否则你将被视为"无响应"。
所以,首先要将你的加载移动到另一个线程上。 Thread
,BackgroundWorker
和Task
都是合理的方法。然后,您需要将任何UI更改返回封送到UI线程。
如果您使用async
(和Tasks
),那么框架会为您执行此操作。同样,如果您使用正确的MVVM模式PropertyChanged
,事件将自动封送到正确的线程上。
如果你做不到,那就是"对"然后,使用Dispatcher.BeginInvoke
自行编组此类更改。
Dispatcher.BeginInvoke(new Action(() =>
{
//UI code ONLY
}), DispatcherPriority.Normal);
但这只是作为创可贴。转向基于异步或MVVM的代码(甚至更好,都是!)