2017-05-10 2 views
0

ich bei var okColors = colors.ToArray();Kann nicht Ausdruck auswerten C#

die folgenden Fehler bekommen kann nicht Ausdruck auswerten, weil der aktuelle Thread in einem Stapelüberlauf-Zustand befindet.

Können Sie bitte dabei helfen?

+0

Kannst du deine Klassenabschlüsse posten? –

+7

Ich denke, Sie haben eine unendliche Rekursion zu 'GetRandomColor', die zu einem Stapelüberlauf führt. Da Sie jedes Mal, wenn die Methode aufgerufen wird, ein neues "Random" erstellen und "Random" basierend auf der aktuellen Zeit gesetzt wird, wählt der Code immer wieder dieselbe Farbe aus und überläuft schließlich den Stapel. –

+1

Und ganz abgesehen von der Frage der Wiederverwendung von "Random", wenn Sie zu viele Farben erzeugen, werden Sie immer eine unendliche Rekursion treffen, weil jede Farbe "ColorsList" ist. Dies wird auch dann passieren, wenn Sie das Problem mit Zufall beheben. – Rob

Antwort

2

Ihr Code löst StackOverflowException aus und wenn es passiert, kann der Debugger keine Variablen mehr bewerten, die zu einem Fehler führen.

Warum Code haben StackOverflowException:

  • Code falsch verwendet Zufallszahl zu erzeugen und endet mit der gleichen Anzahl genügend Anrufe auf. Richtiger Weg - How do I generate a random int number in C#? - Verwenden Sie statische Random Instanz.
  • als Ergebnis überprüft .Contains ständig scheitern und Code wird im Wesentlichen unendliche Rekursion:

    private Color GetRandomColor() 
    { 
        if (true) return GetRandomColor(); 
    } 
    

Zusätzlicher Lesestoff: How do I prevent and/or handle a StackOverflowException?

2

Sie zu haben die gleiche Instanz von Random verwenden für jede rekursive Rufen Sie an, erstellen Sie keinen neuen in jedem Funktionsaufruf. Wenn bei jedem Aufruf der Funktion eine neue zufällige Instanz in der Funktion erstellt wird, erhalten Sie möglicherweise dieselben Werte und keine zufälligen Werte wie erwartet.

Hier ist another thread Sie vielleicht wollen, betrachten:

random erstellt eine neue Instanz von Random jedes Mal, ..., die in wiederum einen neuen Pseudo-Zufallszahlengenerator erzeugt basierend auf der aktuellen Zeit ... die sich nicht so oft ändert wie du vielleicht denkst.

in den verknüpften Faden, Jon Skeet auch vorgeschlagen gegen einen statischen Direkt Variable.

die gleiche Instanz von Random Verwenden Sie immer wieder ... aber nicht „reparieren“ es durch eine statische Zufallsvariable zu schaffen. Das wird auch langfristig nicht gut funktionieren, da Random nicht Thread-sicher ist.

Eine Option kann eine Instanz von Random als Parameter an die Funktion übergeben, dies würde sicherstellen, dass die gleiche Zufallsinstanz entlang der rekursive Kette weitergegeben werden:

private Color GetRandomColor(Random randomGen = new Random()) 
{ 
    Color randomColor = Color.Red; 

    KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor)); 
    KnownColor[] badColors = { KnownColor.AliceBlue }; 
    IEnumerable<KnownColor> okColors = names.Except(badColors).ToArray(); 

    KnownColor randomColorName = okColors[randomGen.Next(okColors.Length)]; 
    randomColor = Color.FromKnownColor(randomColorName); 

    if (!ColorsList.Contains(randomColor) && !randomColor.Name.Contains("Light")) 
    { 
     ColorsList.Add(randomColor); 
    } 
    else 
    { 
     GetRandomColor(randomGen); 
    } 

    return randomColor; 
} 
0

Ich denke, Ihr Code kontinuierlich trifft den else Teil. Bitte überprüfen Sie Ihre if()..else() Bedingung

0

Die folgende Funktion wird für Sie arbeiten.war aufgrund unendlichen Rekursion Aufruf von GetRandomColor Funktion

List<Color> ColorsList = new List<Color>(); 
    private Color GetRandomColor(Random randomGen) 
      { 
       Color randomColor = Color.Red; 
       KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor)); 
       KnownColor[] badColors = { KnownColor.AliceBlue };    
       IEnumerable<KnownColor> colors = names.Except(badColors); 
       colors = colors.ToArray().Except(ColorsList.Select(x => x.ToKnownColor())); 
       KnownColor[] okColors = colors.ToArray(); 
       KnownColor randomColorName = okColors[randomGen.Next(okColors.Length)]; 
       randomColor = Color.FromKnownColor(randomColorName); 

       if (!ColorsList.Contains(randomColor)) 
       { 
        ColorsList.Add(randomColor); 
        if (okColors.Count() == 1) 
        { 
         ColorsList.Clear(); 
        } 
       } 
       else 
       { 
        GetRandomColor(randomGen); 
       } 

       return randomColor; 
      } 

dieser Funktion über dem Ausgabe angegeben

GetRandomColor(new Random()) 

Wie viele nennen. Um es zu beheben, habe ich bereits zufällig ausgewählte Farben aus der okColor-Liste entfernt. Auch nachdem ich alle Farben erhalten habe, habe ich die ColorsList gelöscht, um die Randomisierung fortzusetzen.

Verwandte Themen