StackOverflowException ohne Rekursion oder Endlosschleife?
Hintergrund
Ich habe eine DataGridView
Steuern, welche ich benutze, und ich habe meine hf unten, um die DataGridView.CellFormatting
Veranstaltung, so dass die Werte in einigen Zellen kann mehr lesbar sind. Dieser event-handler funktioniert bestens, Formatierung alle Werte ohne Problem.
Kürzlich habe ich jedoch entdeckt, eine sehr seltene Umstand führt zu einem ungewöhnlichen bug. Die Spalte in meiner DataGridView
für das Element der Fälligkeit hat immer ein int
Wert. 0
weist das Ereignis niemals durch, jeder andere Wert ist ein UTC-Zeitstempel für die Fälligkeit. Der MySQL-db entsprechende Spalte nicht null-Werte zulassen. Wenn sich der Benutzer bewegt hat, von einem DataGridView
Zeile mit einem Fälligkeitsdatum, einem anderen DataGridView
Zeile mit einem Fälligkeitsdatum (an diesem Punkt ist alles scheint noch in Ordnung), und dann eine Taste drückt, die lädt die Daten aus der Datenbank (ohne senden von Aktualisierungen, die im wesentlichen den Aufruf DataAdapter.Fill()
), wird das Programm generiert ein StackOverflowException
**.
Keine Rekursion?
Was ist so ungewöhnlich für mich ist, dass ich nicht sehen, wo die Rekursion oder infinte Schleife ist. Ich fügte int cellFormatCallCount
als in der Klasse, und erhöhen Sie bei jedem Anruf, aber zu der Zeit die Ausnahme geworfen wird, wird der debugger zeigt den Wert der int
als 1, was ich erwarten würde, da ich nicht unter dem Eindruck und die Rekursion wurde anspringt.
Kann mir jemand helfen?
Wie kann ich einen stack-trace? In VS2008 es sagt:
{Cannot evaluate expression because the current thread is in a stack overflow state.}
Beste Grüße,
Robinson
private int cellFormatCallCount = 0;
private void myDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
try {
//to format the cell, we will need to know its value and which column its in
string value = "";
string column = "";
//the event is sometimes called where the value property is null
if (e.Value != null) {
cellFormatCallCount++; //here is my test for recursion, this class member will increment each call
//This is the line that throws the StackOverflowException
/* ********************* */
value = e.Value.ToString();
/* ********************* */
column = actionsDataGridView.Columns[e.ColumnIndex].Name;
} else {
return; //null values cannont be formatted, so return
}
if (column == "id") {
//different code for formatting each column
} else if (column == "title") {
//...
} else {
//...
}
} finally {
cellFormatCallCount = 0; //after we are done with the formatting, reset our recursion counter
}
}
- Kannst du die stack-trace? Das würde helfen, eine Menge.
- Ich dachte, dieser thread wurde über diese website. Boy, ich brauche eine Pause =p
- Ich auch! Ich versuchte herauszufinden, wie er eine Ausnahme von der website. Sheesh!
- Wenn Sie einen Haltepunkt in die betreffende Zeile, kann der Schritt in die Eigenschaft Zugang von e.Wert? Sie können Quickview e.Wert? Wenn ja, was sehen Sie?
- Es ist eine lange gedreht, aber was ist in e.Wert? Wenn die ToString-Methode auf, die definiert ist rekursiv, dann könnte man einen stackoverflow. Ja, es klingt verrückt, aber es ist einfacher als Sie vielleicht denken, vor allem, wenn Sie ein Objekt mit einer Eigenschaft, die Ihnen erlaubt, ein "set" mit dem Typ Object, die vielleicht nur zufällig enthalten sich.
- Wenn Sie brechen direkt vor der ToString-call-und put-e.Wert.ToString() in der watch-Fenster, verursacht stackoverflow aus dem debugger?
- Würde versuchen CStr(e.Wert) irgendwelche Hinweise?
- Sie akzeptiert die Antwort, Pflege lassen Sie uns wissen, was war passiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offenbar e.Wert.ToString() ruft das CellFormatting-Ereignis wieder. Das scheint wenig logisch. Es sollte einfach genug, um herauszufinden, mit einem debugger.
Aber die eigentliche Rekursion verursacht werden könnten, woanders, wie in der pro-Spalte formatieren, dass Sie weggelassen.
Ihre Rekursion check nicht zuverlässig, da Wert==null wird auch zurückgesetzt, und es erscheint für die gemeinsame Nutzung durch alle Spalten. Stellen Sie die surround-e.Wert.ToString() stärker:
Völlig zufällig erraten (keine stack-trace, ist alles, was ich tun kann)...
Versuchen Sie, die Anzeige/format einem Typ, der eine potentiell rekursive
ToString()
?Tippfehler/Fehler könnte die Ursache für
StackOverflowException
...Gegeben, dass dies ein Ereignis ist, könnte es sein, die Auslösung seiner selbst?
Versuchen, indem Sie die cellFormatCallCount variable statische, so dass es gemeinsam von allen Instanzen der Klasse. Ich vermute, dass irgendwie der Veranstaltung ist die Auslösung selbst aber sind Sie nicht zu sehen, weil cellFormatCallCount ist nur lokal auf die einzelnen Instanzen der Klasse, Umgang mit dem Ereignis und somit wird nie erhöht, über 1. Wenn das der Fall ist, dann wird der eigentliche Auslöser für die stackoverflow (Rekursion) überall sein könnte in der Methode und es passiert einfach nicht genügend Stapelspeicher an, die Linie.
Einmal, Sie habe die variable statisch, Sie könnte eine exception werfen, wenn es über einen bestimmten (kleinen) Wert, wie 2. Diese Ausnahme lassen sollte, einen sichtbaren stack trace um.
@Daniel: Wenn das das Problem wäre es nicht schon heben Sie die exception in der Zeile:
@gnirts: Könnten Sie post die die volle Methode und stack-trace zu?
@BCS (unten): ich denke, dass könnte es, aber es könnte leicht sein, einige der code, der nicht in der deo gepostet.
PS. Tut mir Leid, das sollte schon einen Kommentar, aber ich habe nicht genug Wiederholungen 😀
Es ist in keinem Zusammenhang zu dem problem, aber man kann tatsächlich einen
StackOverflowException
ohne Rekursion überhaupt nur mit:Ich Habe gerade ein ähnliches problem bei der stackoverflow mit keine Spur von details.
Mein problem wurde durch eine Instanz eines Objekts, das sollte nicht instanziiert wurde. Ich entfernte die beanstandeten neues Objekt und alles war in Ordnung.
In dem Umstände oben ohne zu sehen, mehr code, sicherzustellen, dass mehrere Ereignisse werden nicht ausgelöst wird, mit der =- absagen die Veranstaltungen entsprechend zu gestalten.
Ich hoffe dies kann jemand helfen.