2017-05-24 3 views
-2

Ich habe einen Audioplayer, der eine Konfigurationsdatei mit einer Liste von Dateien lädt, die in bestimmten Intervallen abgespielt werden sollen. Wie 5 Dateien sollte zwischen 09:30 und 11:30 Uhr geloopt werden - es ist eine Anwendung für Bibliotheken, wo sie die Hintergrundmusik benötigen.Wie kann ich eine Stackoverflow-Ausnahme in meiner Software verhindern?

Wenn ich außerhalb eines Intervalls bin, durchlaufe ich alle meine Zeitintervalle (es könnte 2 Stunden vor dem nächsten Intervall sein) und wenn ich dann finde, dass nichts gespielt werden soll - ich schlafe für eine Sekunde und dann Versuch es noch einmal.

Ich habe ein Problem, wo ich einen Stapelüberlauf nach etwa 3-4 Stunden der Überprüfung für diese Zeitintervalle bekommen (oft nachts, weil die Clients eingeschaltet sind, aber keine Musik sollte in der Nacht spielen).

private void PlayNextFile() 
{ 
    Application.DoEvents(); 
    if (currentState == PlayerState.Started) 
    { 
     //if we find the next slide then play it 
     AudioSlide slideToPlay = FindNextSlide(); 
     if(slideToPlay != null) 
     { 
      PlaySlide(slideToPlay); 
     } 
     else 
     { 
      MedianLog.Log.Instance.LogDebug("Did not find a slide to play now, will check again in a second"); 
      System.Threading.Thread.Sleep(1000); 
      PlayNextFile(); 
     }    
    } 
} 

Haben Sie eine Idee, wie Sie diese Ausnahme umgehen können?

+0

Dup: http://stackoverflow.com/questions/4825530/preventing-stackoverflow-in-recursive-functions –

+1

Vielleicht so etwas wie eine „nächste Datei“ queue Abfüll- und diese Warteschlange regelmäßig verarbeiten? –

+2

Erstellen Sie eine While-Schleife anstelle einer Rekursion. –

Antwort

0

Sie füllen nur Ihren Stapel mit nicht kontrollierten rekursiven Aufrufen.

Eine While-Schleife wäre eine bessere Lösung. So etwas sollte es richtig tun:

private async void PlayNextFile() 
    { 
     while (true) 
     { 
      if (currentState == PlayerState.Started) 
      { 
       //if we find the next slide then play it 
       AudioSlide slideToPlay = FindNextSlide(); 
       if (slideToPlay != null) 
       { 
        PlaySlide(slideToPlay); 
        return; 
       } 

       MedianLog.Log.Instance.LogDebug("Did not find a slide to play now, will check again in a second"); 
       await Task.Delay(1000); 
      } 
      else 
      { 
       return; 
      } 
     }  
    } 
+1

Sie wollen wahrscheinlich immer noch das Protokoll/Schlaf in einem "else". Andernfalls werden Ereignisse im Debug-Protokoll falsch gemeldet. –

Verwandte Themen