(あまり良くないタイトルで申し訳ありません。私の問題をどのように解決できるかわかりません。したがって、私が尋ねる必要がある質問は何ですか:)
環境
プログレス バーを使用して、タスクの進行状況をユーザーに通知します。このタスクは実際には 2 つのステップで実行され、それぞれの実行にかかる時間は全体の約半分です。2 番目のタスクの長さは、開始する直前にしかわかりません (前のタスクの結果に依存するため)。したがって、最初の最大の進行状況を知ることはできません。そのため、2 番目のタスクの前に進行状況バーの最大進行状況を変更します。
これは基本的に私がそれを行う方法です:
// 1st step
progressBar.Maximum = step1Objects.Count * 2; // "2" because the step will take
// half of the total process
progressBar.Value = 0;
foreach (SomeObject step1Object in step1Objects) {
// Build step2Objects
progressBar.Value = ++progress;
}
// At this moment, the progress bar is half filled
// 2nd step
progressBar.Maximum = step2Objects.Count * 2;
progressBar.Value = step2Objects.Count;
// When we start this step, the progress bar is already half filled
foreach (SomeObject step2Object in step2Objects) {
// Do something
progressBar.Value = ++progress;
}
// At this moment, the progress bar is totally filled
問題
この行に到達すると:
progressBar.Maximum = step2Objects.Count * 2;
step1Objects.Count
...プログレスバーは、に比べて非常に小さいため、半分は満たされていない短い瞬間step2Objects.Count
です。したがって、進行状況バーは次のようになります (それがユーザーに表示されます)。
> |
=> |
==> |
===> |
====> |
=====> | End of step 1
=> | progressBar.Maximum = step2Objects.Count * 2;
=====> | progressBar.Value = step2Objects.Count;
======> |
=======> |
========> |
=========> |
==========>|
質問
この「グリッチ」を回避するにはどうすればよいですか?
やるべきことは、2 つのステップの間でプログレス バーの更新を停止することだと思います。BeginUpdate / EndUpdateのようなもので考えていましたが、進行状況バーには存在しないようです...