如何在长循环期间刷新窗口

时间:2015-08-11 13:19:29

标签: c# wpf

我正在进行长循环检查文件夹的内容,分为三部分 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();

3 个答案:

答案 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;您的解决方案几乎完全相同,但我找不到足够的解释来制作有效的解决方案