2012-02-20 15 views
-1

解決策を見つけられないような問題が発生しました。いくつかの回答を読んで、BackgroundWorkerスレッドが必要であることを知っています。このソリューションを機能させるが、私はまだ少し問題に走っている。バックグラウンドワーカーの進行状況バーがロードされない

小さなサイズの2番目のフォームがあり、ProgressBar StyleをMarqueeに設定して画面を中央に設定すると、ローディングバーをエミュレートするためのこの2番目のフォームには何もありません。私のデータがつかみ、私はそれがこのように書かれているデータベースからのデータを解析し、メインフォーム、上のコードの集中セクションにおいて

:バックグラウンドワーカーは、以下のような定義され

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

、メインフォーム上にも表示されます。

private void bwLoading_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     frmLoading lb = new frmLoading(); 
     bool running = true; 
     while (running) 
     { 
      if ((worker.CancellationPending == true)) 
      { 
       lb.Close(); 
       running = false; 
      } 
      else 
      { 
       lb.Show(); 
      } 
     } 

    } 

私はに実行した問題は、この方法では、データを収集し、プロセスとデータのロードが完了したときに消えないばかりを開始したときに表示さんプログレスバーが含まれているロードフォームを示していることですが、ロードしようとしているようにウィンドウは空ですが、ウィンドウは表示されません。なぜこれが動かないのか分かりません。

ローディングフォームを使用するバックグラウンドワーカーが別のスレッドを作成していませんか?それとも、私の読書に欠けていることがありますか?

+0

なぜCancelAsyncですか?それを取り除こうとした? –

+0

DoWork()内にフォームを作成したり表示したりしないでください。 –

+0

@HenkHolterman私はあなたが私の質問を正しく理解しているとは思わない。私は処理中に "ビジー"ボックスを表示しています。キャンセルは、バックグラウンドワーカーが「ビジー」ボックスを非表示にするタイミングを知るようにするためです。 – Sorean

答えて

3

ReportProgress()を使用して、バックグラウンド操作の進捗状況を実際に報告する必要があります。これは、あなたが完了した仕事のどれくらいの割合を知っている必要があります。

進行状況を報告しない場合、進行状況バーは、バックグラウンド操作が完了するまで常に0%のままで、その後に消えます。これはあなたが観察しているものです。

編集:

あなたのコメントを踏まえて

- あなたはマーキースタイルのプログレスバーを使用している - 私は、問題はここにあると思う:

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

私はあなたがUIスレッドからGetData()メソッドを実行疑いますつまり、UIスレッドがブロックされ、進行状況バーを更新できないことを意味します。すべての処理をbwLoading_DoWorkメソッドに移動して、UIスレッドではなく別のスレッドで実行するようにします。その後、プログレスバーが更新されます。 bwLoading.CancelAsync()通話も削除します。これはキャンセルにのみ使用されます。

+0

しかし、フォームはマーキースタイルに設定されています。まだ進行状況を報告する必要がありますか? – Sorean

+0

または私はそれを誤解していると私は2番目のフォームの負荷のバックグラウンドワーカーが必要ですか? – Sorean

+0

@JKM:あなたは正しいですが、私はマーキースタイルを見逃しました。その場合は進捗状況を報告する必要はないので、問題は他の場所にあります。プログレスバーを表示するように設定しましたか? – BrokenGlass