2017-11-23 2 views
2

Ich versuche, eine einfache Anwendung zu machen, um einige Dinge in C# (Visual Studio) zu lernen. Momentan baue ich einen Musikplayer, und eine der Aktionen ist das Ausblenden der Musik beim Klickereignis.Warte auf x Sekunden in der While-Schleife C#

Ich habe kein Problem mit dem Aufbau eines Fade-Out-Teils, ich habe eine while-Schleife gemacht und die Lautstärke jedes Mal um 1% gesenkt, wenn der Loop läuft. Außerdem aktualisiere ich ein Label mit dem Fade-Wert.

Nur Problem ist, für die Verlangsamung der Fading Ich benutze das Thread.Sleep -Ereignis, und dieser Teil friert meine Anwendung ein und blockiert auch alle Updates meiner Textbeschriftung mit dem Fade-Wert.

Die Verblassung funktioniert gut, so der einzige Teil, an dem ich arbeiten muss, ist eine andere Option, etwas Verzögerung zu bauen. Zu einigen Themen habe ich hier über den Timer gelesen, und ich habe eine Timer-Komponente in Visual Studio hinzugefügt. Nur Problem, ich bin neu in C# und weiß nicht, wie man es richtig in dieser while-Schleife verwendet.

Kann mir jemand Hilfe geben?

Der aktuelle Code ist:

private void BtnPodiumtune1Fadeout_Click(object sender, EventArgs e) 
    { 
     PlayerPodiumtune1.settings.volume = 100; 
     fade1 = 100; 
     while (fade1 != -1) 
     { 
      PlayerPodiumtune1.settings.volume = fade1; 
      Fadelevel1.Text = fade1.ToString(); 
      System.Threading.Thread.Sleep(30); 
      fade1 = fade1 - 1; 
     } 
     PlayerPodiumtune1.Ctlcontrols.stop(); 
    } 
+0

Wenn Sie Timer verwenden, dann haben Sie nicht die 'while' Schleife – JohanP

+2

Ist das eine WinForms App? Verwenden Sie ['System.Windows.Forms.Timer'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.timer (v = vs.110) .aspx). –

Antwort

2

Sie ein Muster wie diese verwenden könnten. Ein Timer ist eine schöne Art und Weise zu gehen, nur diese Option zu werfen da draußen:

private async void button_Click(object sender, EventArgs e) 
{ 
    if (Monitor.TryEnter(sender)) 
    { 
    int fade1 = 1000; 
    while (fade1 != -1) 
    { 
     await Task.Delay(30); 
     fade1--; 
    } 
    } 
} 

So Absender ist der Knopf, und Monitor.TryEnter verhindert, dass die Funktion von wieder ausgeführt wird, bis die Funktion ausgeführt wird. async teilt dem Framework mit, dass diese Funktion asynchron ausgeführt werden kann und für await erforderlich ist. await gibt die Steuerung des Threads an die Benutzeroberfläche zurück, bis die Aufgabe erledigt ist.

PS - Sie werden so etwas wie Monitor.TryEnter benötigen, um Re-Enrancy in einer Timer-basierten Lösung zu verhindern, nebenbei bemerkt.

+1

@MickyD - Ausgezeichnet, war mir dessen nicht bewusst. Bearbeitet. – zzxyz

+0

Sie sind herzlich willkommen Sir – MickyD

+0

Danke, der Task.Delay Teil hat den Trick :) –

-1

Dies ist eine Konsole-Anwendung in C#: anstelle eines Timers

using System; 

namespace WaitAsync 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      bool ok = false; 

      Console.Write("EnterTime (Seconds): "); 
      int time = Convert.ToInt32(Console.ReadLine()) * 1000; 

      while (ok != true) 
      { 
       System.Threading.Thread.Sleep(time); 
       ok = true; 
       Console.WriteLine("Waiting Time Just Finished"); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
Verwandte Themen