スレッド、バックグラウンド ワーカー、ディスパッチャについて読み始めることをお勧めします。ソリューションにスレッドを追加しない限り、アプリケーション全体が UI スレッドの助けを借りて実行されます。
連続して実行できるタスクがある場合は、スレッドやバックグラウンド ワーカーを実装する必要はありません。あなたの場合、2つのタスクを実行しようとしています。
- 長方形を更新してウィンドウに描画します
- スレッドを 50 ミリ秒間スリープさせる
UI スレッドが実行されるとき thread.Sleep(50); 描画できません (進行状況を長方形で表示)。これが、アプリケーションが数秒間フリーズし、進行状況を確認する前に完了する理由です。これを2つの例で説明しようと思います。
例:1
プログレス バーをIsIndeterminate="True"
とButton1
でデモ アプリケーションに追加します。
<ProgressBar IsIndeterminate="True" Height="20" Name="progressBar1" Width="177" Visibility="Hidden" />
コードビハインドでは、
private void button1_Click(object sender, RoutedEventArgs e)
{
progressBar1.Visibility = Visibility.Visible;
Thread.Sleep(5000);
progressBar1.Visibility = Visibility.Hidden;
}
このコードを実行すると、コードが連続して実行されるため、進行状況バーは表示されません。プログレスバーが適切に表示および非表示になっていることを確認するには、次の変更を行います。
例 2:
private void button1_Click(object sender, RoutedEventArgs e)
{
progressBar1.Visibility = Visibility.Visible;
Thread t = new Thread(DoMyWork);
t.Start();
}
private void DoMyWork()
{
Thread.Sleep(5000);
//hide the progress bar after completing your work
this.Dispatcher.Invoke((Action)delegate { progressBar1.Visibility = Visibility.Hidden; });
}
このコードを実行すると、UI スレッドが進行状況バーを更新している間に、作成された新しいスレッドがDoMyWork
関数を実行することがわかります。
this.Dispatcher.Invoke((Action)delegate
progressBar1 は UI スレッドで作成され、別のスレッドではアクセスできないため、必要になります。ieThread t = 新しいスレッド(..)
PS-これはコーディングの方法が汚いです。OPの場合に物事がどのように機能するかについての考えを与えるだけです。