1

XMLデータをロードするプロセスにバックグラウンドスレッドを使用したいのですが、おそらくプログレスバーを使用して、アプリケーションがアクティブに何かを実行していることをユーザーに知らせたいと思います。私はネットを検索してこのコードを書きました。
ユーザーが[参照]ボタンをクリックしたときに、WinFormのツリービューにXMLツリーをロードしたいと思います。大きなXMLファイルの場合、winformがフリーズします。したがって、バックグラウンドで作業が進行中であることをユーザーに知らせるために、プログレスバーを追加します。ここではバックグラウンドワーカーを使用しました。

ただし、System.ArgumentExceptionの例外が発生し、 xmlDocument.Load(txtFileName.Text);に「URLを空にすることはできません。\ r \ nパラメータ名:url」というメッセージが表示されます 。 この行。
私のxmlファイルは正しい形式であり、選択した適切な場所にあります。しかし、私はこの例外の原因を見つけることができません。コードの修正を手伝ったり教えてもらえますか?
ありがとう....

       private void btnBrowse_Click(object sender,EventArgs e)
        {
            bgWorker1.RunWorkerAsync();
            StripProgressBar.Value = 0;
            toolStripStatusLabel1.Text = "Browsing for a  Xml file";

            if (open.ShowDialog(this) == DialogResult.OK)
            {
                txtFileName.Text = open.FileName;
                initiatingTree(open.FileName); //this variable gives the name of selected file
            }
            while (this.bgWorker1.IsBusy)
            {
                StripProgressBar.Increment(1);
                // Keep UI messages moving, so the form remains
                // responsive during the asynchronous operation.
                Application.DoEvents();
            }
        }//Browse button      
        private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            xmlDocument = new XmlDocument();
            Thread.Sleep(5000);
            xmlDocument.Load(txtFileName.Text);
            btnBrowse.Enabled = false;
        }
        private void bgworker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
         {
             // Set progress bar to 100% in case it's not already there.
             StripProgressBar.Value = 100;
             if (e.Error == null)
             {
                 MessageBox.Show(xmlDocument.InnerXml, "Download Complete");
             }
             else
             {
                 MessageBox.Show("Failed to download file");
             }
             // Enable the Browse button and reset the progress bar.
             this.btnBrowse.Enabled = true;
             StripProgressBar.Value = 0;
             toolStripStatusLabel1.Text = "work finished processing request.";  
         }//workerCompleted  
4

2 に答える 2

4

ユーザーが「参照」をクリックするとすぐに非同期プロセスを開始します。

bgWorker1.RunWorkerAsync();

これはDoWorkバックグラウンド ワーカーのメソッドを呼び出します。このメソッドは 5 秒間スリープしtxtFileName.Text、ユーザーがFileOpenDialog.

byWorker1.RunWorkerAsync()(および忙しい待機中)をif (open.ShowDialog(this) == DialogResult.OK)ブロックに移動する方がよいでしょう。

    private void btnBrowse_Click(object sender,EventArgs e)
    {
        StripProgressBar.Value = 0;
        toolStripStatusLabel1.Text = "Browsing for a  Xml file";

        if (open.ShowDialog(this) == DialogResult.OK)
        {
            txtFileName.Text = open.FileName;
            initiatingTree(open.FileName); 

            bgWorker1.RunWorkerAsync();

            while (this.bgWorker1.IsBusy)
            {
                StripProgressBar.Increment(1);
                // Keep UI messages moving, so the form remains
                // responsive during the asynchronous operation.
                Application.DoEvents();
            }
        }
    }

この種の問題では、ファイルがロードされる場所にブレークポイントを配置し、それが発生したときの値を確認すると役立つ場合があります...空の文字列で呼び出されていることに気付くかもしれません。

RunWorkerAsyncパラメータを取るのバージョンを検討することもできます。テキストボックスから非同期的に読み取ろうとする代わりに、その方法でファイルを渡すことができます。

Application.DoEvents()個人的には、 ;を呼び出すループは使用しません。代わりに、制御を UI スレッドに戻し、非同期スレッドから制御を UI スレッドに戻してInvoke()、プログレスバーの更新を実行します。

于 2009-03-02T14:47:45.673 に答える