
以下の仕様を「C# + Windows Form」で実現しようとしています。
1.FormにTextBoxとProgressBarを配置
2.ProgressBarのMaximumに繰り返し回数を、Valueに0を設定する。(MinValueはデフォルト)
3.foreachで以下を繰り返す。
(1) TextBoxに"n件目を処理しています..."を設定しRefresh()で表示する
(2) 時間が掛かる処理(数秒~数十秒)を実行する
(3) ProgressBar.Valueに1を加算する
(4) Application.DoEvents()で画面全体を更新する
n=4で実行したところ、ProgressBarの更新タイミングがループ1周分遅れているように見えます。
TextBoxに"1周目を処理しています..."と表示
TextBoxに"2周目を処理しています..."と表示
(2)の処理を実行
ProgressBarが1件分進行(25%)
TextBoxに"3周目を処理しています..."と表示
(2)の処理を実行
ProgressBarが1件分進行(50%)
TextBoxに"4周目を処理しています..."と表示
(2)の処理を実行
ProgressBarが1件分進行(75%)
(2)の処理を実行
ProgressBarが1件分進行(100%)
DoEvents()の前に1000msのSleepを挿入すると(1)~(4)を繰り返して実行し、意図した動作になるのですが、
繰り返し回数が最大で30回程度になるため、それだけで30sのロスになってしまいます。
Sleep無しでProgressBar.Valueの更新を即座に反映するには、どうすればいいのでしょうか。
(4)で呼び出すメソッドをPrgeressBar.Refresh() or Update() or Invalidate()に変えても結果は同じでした。
Sleepを10msに短縮すると、同様の問題が発生します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/07 05:18