3

これは、イベントとDoWorkイベントのコードです。問題は、関数プロセス操作が終了する前に、progressBar が 100% になるのがはるかに高速であることです。したがって、progressBar が最大 100% の場合、progressBar を 101% にすることはできないため、エラー例外が発生します。ProgressChangedRunWorkerCompleted

関数 process / progress に従って、progressBarが進行するようにする必要があります。DoWorkイベントでの計算に何か問題があると思います。

一番Form1上に追加しました:

Int i;

コンストラクターで私がした:

i = 0;

backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();

そして、これは のイベントですBackgroundworker:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   BackgroundWorker worker = sender as BackgroundWorker;
   //int currentLength;
   //int currentIndex;
   //int lastIndex = 0;
   string startTag = "T256=\"";
   string endTag = "\"";
   int startTagWidth = startTag.Length;
   //int endTagWidth = endTag.Length;
   int index = 0;

   h = new StreamReader(@"d:\DeponiaSplit\testingdeponias_Translated.txt");

   while ((line = h.ReadLine()) != null)
   {
      if (index > f.LastIndexOf(startTag))
      {
         break;
      }

      int startTagIndex = f.IndexOf(startTag, index);
      int stringIndex = startTagIndex + startTagWidth;
      index = stringIndex;
      int endTagIndex = f.IndexOf(endTag, index);
      int stringLength = endTagIndex - stringIndex;

      if (stringLength != 0)
      {
         string test = f.Substring(stringIndex, stringLength);
         f = f.Substring(0, stringIndex) + line + f.Substring(stringIndex + stringLength);

         if (listBox1.InvokeRequired)
         {
            textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = line; }));
         }

         i = i + 1;
         System.Threading.Thread.Sleep(500);
         worker.ReportProgress((i * 1));
      }
   }

   h.Close();

   StreamWriter w = new StreamWriter(@"D:\New folder (24)\000004aa.xml");
   w.AutoFlush = true;
   w.Write(f);
   w.Close();
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //this.progressBar1.Text = (e.ProgressPercentage.ToString() + "%");
    progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   if ((e.Cancelled == true))
   {
      this.progressBar1.Text = "Canceled!";
   }
   else if (!(e.Error == null))
   {
      this.progressBar1.Text = ("Error: " + e.Error.Message);
   } 
   else
   {
       this.progressBar1.Text = "Done!";
   }
}

正しく動作しないのはなぜですか?

FileStream を使用した作業

今私は表示されるラベルをprogressBarに追加したいと思っていまし%%.

だからProgressChanged私がしたイベントで:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    label3.Text = (e.ProgressPercentage.ToString() + "%");
} 

しかし、それは機能しません - label13% が 1 に変更されただけでは動きません。どうすればいいですか?

4

2 に答える 2

4

を使用しないのはなぜですかFile.ReadAllLines。文字列の配列を返します。行の総数に対する処理中の行のパーセンテージとして進行状況を報告できます。

string[] lines = File.ReadAllLines(@"d:\DeponiaSplit\testingdeponias_Translated.txt"); 
// ...
worker.ReportProgress(i * 100 / lines.Length);
于 2012-04-29T18:01:31.470 に答える
0

「ReportProgress()」メソッドは、「i」が「i+1」ステートメントでインクリメントされた直後に「i」を報告しています。i は、指定したパラメーターに一致する文字列が見つかるたびにインクリメントされる変数です。ここでの問題は、コンテキストなしで整数を報告していることだと思います。パラメータに一致する文字列が含まれているファイルの合計行数を知っていますか。(i/totalNumLinesMatchingParameters) * 100 を報告することをお勧めします。これは、パーセンテージで数値を報告します。ただし、これには File の書き込みアクションは含まれません。したがって、プログレスバー/プログレスバーラベルにファイルを書き込むアクションを含める場合は、上記を別の方法でスケーリングすることをお勧めします...

于 2012-04-29T18:10:44.057 に答える