progressBar没有更新,progressForm没有关闭

时间:2014-03-14 13:59:31

标签: c# winforms progress-bar backgroundworker

我正在制作一个小工具,它读入一堆文件,如果文件不包含这些行,则添加某些xml。这很有效,但由于目录和文件较大,可能会耗费时间。

因此,我决定使用backgroundworker并添加一个进度条,显示我们在执行中的位置。

但问题是进度条不会更新。

参考代码:

    BackgroundWorker bw = new BackgroundWorker();
    Form progressForm = new Form();
    ProgressBar progressBar = new ProgressBar();

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {

        if (!csprojPaths.Any())
        {
            MessageBox.Show(Resources.noprojectsfound);
        }
        else
        {
            for (int i = 0; i < csprojPaths.Count(); i++)
            {
                string csprojPath = csprojPaths[i];
                CheckOutFromTFS(csprojPath);
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(csprojPath);
                Convert(xmlDoc, ruleset);
                xmlDoc.Save(csprojPath);
                bw.ReportProgress(i);
            }
        }
    }

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressForm.Close();
        DisplayDialog(csprojPaths);
    }


    public void ConvertIn(string pad, string rules)
    {

        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

        path = pad;
        ruleset = rules;

        csprojPaths = Directory.GetFiles(path, "*.csproj", SearchOption.AllDirectories);
        progressForm.Size = new Size(30, 30);
        progressForm.Controls.Add(progressBar);
        progressBar.Visible = true;
        progressBar.Minimum = 0;
        progressBar.Maximum = csprojPaths.Count();
        progressBar.Value = 0;
        progressBar.Step = 1;
        progressForm.ShowDialog();

        bw.WorkerSupportsCancellation = false;
        bw.WorkerReportsProgress = true;
        if (!bw.IsBusy)
        {
            bw.RunWorkerAsync();
        }


    }

带有进度条的表单会打开,但永远不会关闭,也不会更新栏。当我关闭progressForm时,DisplayDialog(csprojPaths)会被执行。如果我保持progressForm打开,它就不会。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

问题: progressForm.ShowDialog()等待,除非表单已关闭以执行其他语句。因此,progressForm.ShowDialog()之后的语句将不会被执行,直到表格被关闭。

解决方案:您需要致电progressForm.Show(),这不会阻止程序流程。 因为它将独立打开progressForm,因此progressForm.Show()之后的语句也会在不等待的情况下执行。

来自MSDN:Form.ShowDialog()

  

您可以使用此方法在您的中显示模式对话框   应用。调用此方法时,后面的代码不是   执行直到对话框关闭后

替换它:

 progressForm.ShowDialog();

有了这个:

 progressForm.Show();