-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の処理がおそらくすべてのリソースを使用し、XMLの処理が完了するまで、UIスレッドがそのコントロールを更新する機会がないためです。

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 に答える