2016-03-31 22 views
0

tüm programı uyur, ben aşağıdaki kodda yaptığı gibi iki ilerleme çubuğu çalıştırmak istiyorum:Thread.Sleep(); Ben ilerleme çubukları ile ilgili bir sorun

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); 
     } 
    } 
} 

Ve belirsiz satın gelmiyor.Fark iştir başka progressbar var ilk çubuk çalışırken.

Yardımlarınız için teşekkür ederiz.

+1

[Bu yanıtı okuyun] (http://stackoverflow.com/a/8710218/1997232). – Sinatr

cevap

1

Thread.Sleep geçerli parçayı duraklatır.

Kodunuzdan bunu bir windows formunda veya wpf uygulamasında kullandığınızı farz ediyorum, değil mi?

Artık yalnızca tek bir kullanıcı adı vardır. Şimdi, ui dizisinde uyurken, tüm kullanıcı arabirimi duraklatıldı. Yani arka plan iş parçacığında ui olmayan işçi kodunu koymak zorundasın.

alsp bu soruya bakın: How to update the GUI from another thread in C#? veya

How to update UI from another thread running in another class ve yaklaşık bu MSDN Article (bir şeyi bölmek, çalışmalarını simüle etmek, her neyse) UI iş parçacığı bir şey geciktirmek için kullanılır parçacığı model

0

Sleep ise o zaman (Sleep UI iş parçacığı engelliyor) düzgün yapmak için async/await kullanabilirsiniz:

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

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

Eğer bunu yaparsam, program güncellemek için her saniye beklemez, hepsini bir araya getirir. Nedenini bilmiyorum ... – davidtxu74

0

Bu tür bir senaryo için tasarlanan BackgroundWorker'a bir göz atın. Uzun sürecinizi bir arka plan iş parçacığında çalıştırır ve ilerleme değiştikçe UI güncellemelerini gerçekleştirmenizi sağlar.