2016-03-31 13 views
0

すべてのプログラムを眠る、私は次のコードで行うように2つのプログレスバーを実行したい:Thread.Sleep();私はプログレスバーで問題を抱えている

namespace probando 
{ 
    public partial class MainWindow : Window 
    { 

      int sec = 0; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 
      string stringSec = sec.ToString(); 

      for (int i = 0; i <= sec; i++) 
      { 
       masuno(i,sec); 
      } 

     } 

     private void Tiempo_segundos_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
     { 
      sec = (int) Tiempo_segundos.Value; 
     } 

     private void masuno(int i, int sec) 
     { 
      Porcentaje_restante.Maximum = sec; 

      Porcentaje_restante.Dispatcher.Invoke(() => Porcentaje_restante.Value = i, DispatcherPriority.Background); 

      Thread.Sleep(1000); 
     } 
    } 
} 

そして私は不確定購入doesn'tの仕事である別のプログレスバーを持っています最初のバーは動作しています。

ありがとうございました。

+1

[回答](http://stackoverflow.com/a/8710218/1997232)を参照してください。 – Sinatr

答えて

1

Thread.Sleepは、現在のスレッドを一時停止します。

あなたのコードから、これをWindowsフォームまたはwpfアプリケーションで使用していると思われます。

ここでは、1つのUIスレッドしかありません。今あなたがuiスレッドで寝ると、UI全体が一時停止します。だからあなたは、バックグラウンドスレッドにUIではないワーカーコードを置く必要があります。

がALSPこの質問を参照してください: How to update the GUI from another thread in C#?または

How to update UI from another thread running in another class約このMSDN Article(何かを分割するために、作業をシミュレートするために、何でも)UIスレッドで何かを遅延させるために使用されるスレッドモデル

0

Sleep場合は、あなたは適切に(Sleepは、UIスレッドをブロックしている)ことを行うためにasync/awaitを使用することができます。

async void masuno(int i, int sec) 
{ 
    ... 

    // Thread.Sleep(1000); - instead of this do: 
    await Task.Delay(1000); 
} 
+0

これを行うと、プログラムは毎秒更新を待つことなく、すべて一緒になります。どうしてか分かりません... – davidtxu74

0

この種のシナリオ用に設計されたBackgroundWorkerをご覧ください。バックグラウンドスレッドで長いプロセスを実行し、進行状況の変化に合わせてUI更新を実行できるようにします。

関連する問題