【问题标题】:Implementing a progress bar in WinForms app during parsing XML在解析 XML 期间在 WinForms 应用程序中实现进度条
【发布时间】:2012-07-03 16:53:07
【问题描述】:

我创建了一个应用程序,它通过 XML 文件传递​​并“提取”具有特定属性的特定值的条目。该应用程序运行良好,但 XML 文件有超过 52,000 个条目,并且只有 3 个值可供排序(因此执行它自然需要一些时间)。因此,我想实现一个进度条,这样我就可以跟踪我的应用程序所取得的进展。我用谷歌搜索了它,但没有一个解决方案对我有用(应用程序确实有效,但进度条根本不动),所以如果你能帮助我,那就太好了。

提取条目的代码是这样的:

XmlNodeList nodes;
string ExtractedXML = "";

private void extractingXMLToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (nodes.Count != 0)
    {
        foreach (XmlNode node in nodes)
        {
            if (String.Compare(node.ChildNodes[6].ChildNodes[0].Attributes.GetNamedItem("code").Value.ToString(), "CodeValue") == 0)
            {
                tempXML = node.InnerXml;
                temp = "<" + node.Name + " code=\"" + node.Attributes.GetNamedItem("code").Value + "\">" + Environment.NewLine;
                temp += tempXML + Environment.NewLine;
                temp += "</" + node.Name + ">";
                ExtractedXML += temp + Environment.NewLine;
                temp = ""; 
            }
        }
        textBox1.Text = ExtractedXML;
    }
}

每个具有相似代码的值都有一个 ToolStripMenue 项,只有“CodeValue”发生变化。如何实现进度条以显示应用程序的进度?

【问题讨论】:

  • 使用 XML 库或至少使用 StringBuilder。您可能会看到很多改进,以至于您不再需要 ProgressBar。
  • 我省略了进度条,因为它没有做任何事情,并且委托函数只是给我带来了错误。我的问题是如何实现进度条来跟踪这个功能的进度。至于使用 XML 库,我从未使用过它们,当我尝试用谷歌搜索它时,我得到了 XmlTextReades 和类似函数的结果。我看过一些 xpath 示例并尝试实现它们,但没有成功。任何建议都非常受欢迎。谢谢

标签: c# .net xml winforms progress-bar


【解决方案1】:

最好的办法是不在 UI 线程上处理 XML。

您看不到进度条增加的原因是因为处理 XML 可能会使用所有资源,并且 UI 线程没有机会更新它的控件,直到处理 XML 完成。

您可以使用BackgroundWorker 进行处理,并使用ProgressChanged 事件让UI 知道它应该更新进度条。 通过这样做,您的应用程序将保持响应,并且 UI 不会冻结。 UI 线程也将获得一些 CPU 时间,它能够更新他的控件并响应事件。

【讨论】:

    【解决方案2】:

    您应该在单独的线程中执行长时间运行的进程,BackgroundWorker 在这里会很有用。开始您的流程调用时:

    bgWorker.RunWorkerAsync(//pass in object to process)
    

    然后有一个ReportProgress 事件,您可以在其中增加进度条,例如

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

    最后,在do work 事件中,您需要使用公式调用报告进度以获取完成的百分比,以及传入处理后的结果,这是我使用的一个示例:

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
            bgWorker.ReportProgress((outputGrid.Rows.Count * 100) / importGrid.Rows.Count, result);   
    }
    

    【讨论】:

    • 并且总是在完成的事件中检查e.Error
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多