2009-03-02 10 views
1

XMLデータをロードするプロセスのバックグラウンドスレッドを使用したい場合があります。アプリケーションが積極的に何かを行っていることをユーザーに知らせるためのプログレスバーが必要です。 私はネットを検索してこのコードを書いています。
ユーザーが[参照]ボタンをクリックしたときに、winformでtreeviewにXMLツリーをロードしたいとします。 大きなXMLファイルの場合、winformはフリーズします。バックグラウンドで作業が進行中であることをユーザーに知らせるために、進捗バーを追加します.iここでバックグラウンドワーカーを使用しました。XMLファイルをアップロードする際のプログレスバー

しかし、 "URLを空にすることはできません\ rを\ nParameter名前:URL" このメッセージを示すSystem.ArgumentExceptionのは例外を上げているxmlDocument.Load(txtFileName.Text)上;この行。
私の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

あなたは、ユーザーがこれはあなたの背景労働者のDoWorkメソッドを呼び出します

bgWorker1.RunWorkerAsync(); 

を呼び出すことで、「参照」をクリックすると、すぐに非同期プロセスを開始しています5秒間スリープし、ユーザーがFileOpenDialogに入力を完了したかどうかにかかわらず、値をtxtFileName.Textから引き出します。

​​(およびビジー待機中)を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スレッドに制御を戻してから、Invoke()を非同期スレッドからプログレスバーの更新に反映させます。

+0

ありがとう、 まだ例外が残っています。例外については、私の質問に入れてください。 –

1

メソッドがbgWorker1.RunWorkerAsync(); DoWorkが発砲されたイベントと呼ばれます。

このメソッドはアプリケーションの先頭で呼び出されるため、ファイル名のテキストボックスは空です。

ご理解いただければ幸いです。

関連する問題