0

これを読み込みバーとして想像できる場合:

for (int i = 0; i < r.Width / 2; i++) //Fills half the loading bar.
{         
    Rectangle rect = can.Children[3] as Rectangle; //getting the 3rd element of my Canvas
    if (rect != null)
     {
         rect.Fill = brush;
         rect.Width = i;
         Thread.Sleep(50);
     }
}

そのため、アプリケーションは追加の長方形を追加する進行状況を表示しません。代わりに、スレッド スリープの合計時間だけフリーズし、for ループが終了すると、バー全体が表示されます。

どうしてこれなの?

ローディングバーが組み込まれていることは承知していますが、これは私が抱えている問題のほんの一例です。

4

1 に答える 1

2

スレッド、バックグラウンド ワーカー、ディスパッチャについて読み始めることをお勧めします。ソリューションにスレッドを追加しない限り、アプリケーション全体が UI スレッドの助けを借りて実行されます。

連続して実行できるタスクがある場合は、スレッドやバックグラウンド ワーカーを実装する必要はありません。あなたの場合、2つのタスクを実行しようとしています。

  1. 長方形を更新してウィンドウに描画します
  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)delegateprogressBar1 は UI スレッドで作成され、別のスレッドではアクセスできないため、必要になります。ieThread t = 新しいスレッド(..)

PS-これはコーディングの方法が汚いです。OPの場合に物事がどのように機能するかについての考えを与えるだけです。

于 2013-10-13T15:01:20.957 に答える