-1

我制作了一个应用程序,它通过 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”发生变化。如何实现进度条以显示应用程序的进度?

4

2 回答 2

3

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

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

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

于 2012-07-03T09:23:12.383 回答
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);   
}
于 2012-07-03T09:31:15.287 回答