Frage

Ich habe ein kleines Code-Beispiel:

private void MonitorItems()
        {
            if (someCondition)
            {
                dateSelected = DateTime.Now;
                GetAllItems();
            }
            else
            {
                if(allItems.Count>0)
                    CheckAllItems();
            }
            MonitorItems();
        }

Die Methode getAllItems geht an DB und erhalten alle neuen Produkte für die Sammlung -> AllItems. Dann wird die CheckAllItems Methode:

private void CheckAllItems()
        {
            foreach (Item a in new List<Item>(allItems))
            {
                switch (a.Status)
                {
                    case 1:
                        HandleStatus1();
                        break;
                    case 2:
                        HandleStatus2(a);
                        break;
                    case 0:
                        HandleStatus0(a);
                        break;
                    default:
                        break;
                }
            }  
        }

In einigen Fällen (in HandleStatus1 und HandleStatus2) i an die DB gehen muß, einige Updates machen, und dann wieder die Sammlung AllItems bevölkert mit der Methode getAllItems aufrufen.

Diese Art von Code wirft Stack.Overflow Ausnahme in WinFormsApp. Ich habe zwei Fragen:
1. Ist diese Art von Ausnahme wird in WINSERVICE Anwendung geworfen werden, mit dem gleichen Code?
2. Was ist Ihre Meinung Timer statt Selbst Aufruf Methode?

War es hilfreich?

Lösung

Eine „Selbst Aufruf der Methode“ mehr richtig ein „rekursive Methode“ . Ihre Lösung ist kreativ, ich werde dir das geben. Aber tun Sie es nicht. Stapelspeicher ist sehr begrenzt. Sie werden dieses Problem sehen, wenn Sie auf einen Dienst zu bewegen, und es gibt viel bessere Möglichkeiten, dies zu verarbeiten. Ein Timer ist sehr sinnvoll, wenn in einem Service verwendet wird.

Andere Tipps

rekursive die Methode in Ihrem Fall Aufruf ist als schlecht als einen Timer, es zu tun. Sie sollten auch nicht !!

Nur eine einfache Schleife verwenden und den Faden Schlaf seit einiger Zeit zwischen senden.

MS IL hat .tail op-Code. Aber c # Punkt will Endrekursion erkennen (. By the way, Endrekursion in .net so langsam ist ((

Warum brauchen Sie überhaupt Rekursion? Es gibt keine Datenflusskontrolle Aussage, dass das Verfahren die Kette zu stoppen ermöglichen Rekursion und verlassen. Die unendliche Rekursion ist wahrscheinlich das, was den Überlauf verursacht. Eine bessere Lösung wäre mit der Rekursion ganz zu beseitigen. die sonst Wrapper Entfernen erreicht das gleiche Ergebnis ohne Rekursion mit:

private void MonitorItems()
{
    if(someCondition)
    {
        dateSelected = DateTime.Now;
        GetAllItems();
    }
    if(allItems.Count>0)
        CheckAllItems();
}

Dies wird das gleiche Ergebnis erreichen, ohne in einer Schleife stecken zu bleiben. Dann können Sie Regeln implementieren den Anruf im Rahmen der Ausführungsumgebung zu wiederholen: a. Taste auf einem Formular oder einen Timer auf einer Dienstanwendung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top