2016-07-01 7 views
0

バックグラウンドワーカーが進行状況バーで動作しない理由(デフォルトでは、可視性はfalseに設定されています)。私のバックグラウンドワーカーが進行状況バーのために動作しない理由

バックグラウンドで進行状況バーを表示しようとしています。ユーザーが[OK]ボタンをクリックすると、タイマーが開始され、進行状況バーが表示されます。 を実行し、backgroundWorker.RunWorkerAsync()を実行します。 backgroundWorker_RunWorkerCompletedではプログレスバーの表示をfalseに設定しました。

問題は、プログレスバーを表示するだけですが、進行状況を表示しないことです。

私のコードはここにある:

 private void btnOk_Click(object sender, EventArgs e) 
     { 
      timer.Start(); 
      progressBar.Visible = true; 
      backgroundWorker.RunWorkerAsync(); 
      doSomeWork(); 
     } 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
     } 

     private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      timer.Stop(); 
      progressBar.Visible = false; 
     } 

     private void timer_Tick(object sender, EventArgs e) 
     { 
      MessageBox.Show("called"); 
      if (progressBar.Value == progressBar.Maximum) 
      { 
       progressBar.Value = progressBar.Minimum; 
       return; 
      } 
      progressBar.PerformStep(); 
     } 

     private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar.Value = e.ProgressPercentage; 
     } 

なぜそれがプログレスバーに進行状況が表示されませんか?それは何が間違っていますか?

+0

「問題は進捗状況を示していますが、進捗状況は表示していません」とはどういう意味ですか? – currarpickt

+0

の編集をご覧ください。 –

答えて

2

backgroundWorker_DoWorkは何もしていません。 をDoWorkイベントに移動します。そしてReportProgresstrueに設定する必要があります。

private void btnOk_Click(object sender, EventArgs e) 
{ 
    timer.Start(); 
    progressBar.Visible = true; 
    backgroundWorker.ReportsProgress = true; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    doSomeWork(); 
} 

private void doSomeWork() 
{ 
    //do what you want here.. 
    backgroundWorker.ReportProgress(yourprogresspercentagenumber); 
    //do what you want again.. 
    backgroundWorker.ReportProgress(yourprogresspercentagenumber); 
} 
+0

プログレスバーの値が変更されていますか? –

+0

@ test test私の更新を参照してください。 'doSomeWork'関数でレポートの進捗値を設定することができます。 – currarpickt

+0

あなたは正しいです、私はすでにprogrssバーで進歩を見せていますが、この達成方法を使用している問題は、私のフォームはそれ自身を隠す(this.hide())とdoSomething()関数の別のフォームをポップアップすると仮定していますしかし、私が "backgroundWorker.ReportProgress(100、null);を実行しても、プログレスバーは100%消えます。" form2.showdialog()の後に。しかし、フォーム2は全く別の質問である –

2

ここでは2つの概念を混在させています。バックグラウンドワーカーまたはを使用するかどうかを決定してください。

何も起こらない理由は、あなたのbackgroundWorker_DoWorkなしです。です。バックグラウンドワーカーはすぐに終了し、backgroundWorker_RunWorkerCompletedが呼び出され、タイマーが再び停止します。

backgroundWorker_ProgressChangedは、backgroundWorker.ReportProgress()(に設定されているbackgroundWorker.ReportsProgress)を呼び出した場合にのみ発生するため、呼び出されることはありません。

doSomeWork()で行う作業は、進捗状況を報告している間にbackgroundWorker_DoWorkで行われるべきだと思います。次のようなものを試してみてください。

private void btnOk_Click(object sender, EventArgs e) 
{ 
    progressBar.Visible = true; 
    backgroundWorker.ReportsProgress = true; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    doALittleWork(); 
    backgroundWorker.ReportProgress(10, null); 
    doMoreWork(); 
    backgroundWorker.ReportProgress(20, null); 
    //... 
    doLastWork(); 
    backgroundWorker.ReportProgress(100, null); 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    progressBar.Visible = false; 
} 

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

これは必要な操作を行う必要があります。このシナリオではタイマーは必要ありません。

+0

ありがとうrene ...あなたは同じことを達成しなければならない場合、あなたはそれのためにいかがですか?コメントを通じて説明してください。どうもありがとうございます。 –

+0

@testtestが私の答えを更新しました。 –

+0

あなたは正しいです、私はすでにprogrssバーで進歩を見せていましたが、この達成方法を使用している問題は、私のフォームは自分自身を隠す(this.hide())とdoSomething()関数の別のフォームをポップアップするしかし、私が "backgroundWorker.ReportProgress(100、null);を実行しても、プログレスバーは100%消えます。" form2.showdialog()の後に。そのフォーム2は決してポップアップしません。 –

関連する問題