2016-03-31 13 views
0

ich ein Problem mit den Fortschrittsbalken haben, möchte ich zwei Fortschrittsbalken laufen, wie ich in dem folgenden Code tun:Thread.Sleep(); Platz für alle das Programm

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

Und ich habe eine andere progressbar, die nicht funktioniert unbestimmt kaufen ist während der erste Balken funktioniert.

Vielen Dank für Ihre Hilfe.

+1

Siehe [diese Antwort] (http://stackoverflow.com/a/8710218/1997232). – Sinatr

Antwort

1

Thread.Sleep unterbricht den aktuellen Thread.

Von Ihrem Code nehme ich an, dass Sie dies in einer Windows Forms oder WPF-Anwendung verwenden, richtig?

Jetzt gibt es nur einen einzigen ui-Thread. Wenn du jetzt im UI-Thread schläfst, wird das ganze UI pausiert. Sie müssen den Worker-Code, der nicht der UI ist, in einen Hintergrundthread einfügen.

Siehe alsp diese Frage: How to update the GUI from another thread in C#? oder How to update UI from another thread running in another class

und dies MSDN Article über die Threading-Modell

0

Wenn Sleep verwendet wird, etwas in UI-Thread zu verzögern (Arbeit zu simulieren, etwas zu teilen, was auch immer), dann können Sie async/await tun verwenden, die richtig (Sleep UI-Thread blockiert):

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

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

Wenn ich dies tue, wartet das Programm nicht jede Sekunde auf Updates, es macht alles zusammen. Ich weiß nicht warum ... – davidtxu74

0

Werfen Sie einen Blick auf die BackgroundWorker, die für diese Art von Szenario entwickelt wurde. Es führt Ihren langen Prozess in einem Hintergrundthread aus und ermöglicht Ihnen die Durchführung von UI-Aktualisierungen, wenn sich der Fortschritt ändert.