我正在进行长循环检查文件夹的内容,分为三部分
p1 - 此文件夹中包含超过5000个文件夹,
p2 - 每个都有~10个文件夹,
p3 - 然后是每个文件/文件夹的未知数量。
我制作了一个最大值= p1.nbFolder的进度条 在每个p1.folder的末尾,我将progressbar.Value增加一个。 但是窗口冻结以及每个文件夹末尾刷新窗口的唯一工作是MessageBox.Show("");
this.UpdateLayout();不工作
Thread.sleep代码(0);既不
for (int inc = 0; inc < postes.Items.Count; inc++) {
poste = (TreeViewItem)postes.Items[inc];
poste.IsSelected = true;
tranches = (TreeViewItem)tr_tranche.Items[0];
for (int incb = 0; incb < tranches.Items.Count; incb++) {
tranche = (TreeViewItem)tranches.Items[incb];
tranche.IsSelected = true;
StackPanel SPposte = (StackPanel)poste.Header;
Label Lposte = (Label)SPposte.Children[1];
String Sposte = (String)Lposte.Content;
StackPanel SPtranche = (StackPanel)tranche.Header;
Label Ltranche = (Label)SPtranche.Children[1];
String Stranche = (String)Ltranche.Content;
//str.Append("Poste : " + Sposte + " | Tranche : " + Stranche + " | indice : " + incb + " \n");
if (tranche != null) {
StackPanel stack = (StackPanel)tranche.Header;
Label lbl = (Label)stack.Children[1];
String nom = lbl.Content.ToString();
tr_folio.Items.Clear();
_folio = getDossier(nom, _tranche);
//ne filtre rien
_folio.getDossiers("a*");
_folio.getFichiers();
tr_folio.Items.Add(Utils.TreeUtils.ContenuDossier(_folio));
lbl_source.Content = _folio.Chemin;
TreeViewItem entete = (TreeViewItem)tr_folio.Items[0];
entete.IsExpanded = true;
}
//MessageBox.Show(incb.ToString());
tranche.IsSelected = false;
}
poste.IsSelected = false;
pgrB.Value++;
Thread.Sleep(1);
this.UpdateLayout();
答案 0 :(得分:0)
主UI线程需要可以自由处理Windows消息。如果将工作移动到后台线程,UI线程将能够绘制窗口,响应用户输入(如取消按钮)等。
有许多使用WPF进行多线程处理的例子。例如,请参阅this question以获取一些有用的信息。
答案 1 :(得分:0)
潜在阻塞代码的最佳解决方案之一是使用线程,以便它不会阻止任何内容或任何其他代码的UI。它在自己的小世界中运行。
Task mytask = Task.Factory.StartNew(myfunc,aparam);
你甚至可以这样做(沿着行,而不是放在编码窗口来检查语法)
var mytask = Task.Factory.StartNew(myfunc).ContinueWith( result => its_done_func());
因此,您可以告诉它何时完成,您还可以使用函数来更新所有结果。你当然可以使用lambda's
答案 2 :(得分:0)
我找到了这个教程。 ProgressBar control tutorial
保罗&gt;您的解决方案几乎完全相同,但我找不到足够的解释来制作有效的解决方案