【发布时间】:2015-08-12 20:29:24
【问题描述】:
我正在对文件夹的内容进行长时间循环检查,分为三部分。
p1 - 此文件夹中有超过 5000 个文件夹,
p2 - 每个有约 10 个文件夹,
p3 - 然后每个文件/文件夹的数量未知。
我已经制作了一个最大值 = p1.nbFolder 的进度条 在每个 p1.folder 的末尾,我将 progressbar.Value 加一。 但是窗口冻结并且在每个文件夹末尾刷新窗口的唯一工作是 MessageBox.Show(" ");
this.UpdateLayout();不工作
线程.睡眠(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();
【问题讨论】:
-
您应该在后台线程或异步方法中运行您的代码。您正在锁定主线程,这不是一个好的解决方案。
-
拆分作业并使用
DispacherTimer完成一项作业或将作业放入Task(在调用UI 调用时)。 -
删除所有这些代码并使用正确的 XAML 和数据绑定。