Prozess ist beendet, aufgrund StackOverflowException
Dies ist schwierig die situation zu erklären. Ein service-Prozess, der startet 2 threads, jeder thread loops für immer, sondern Schlafmöglichkeiten für je 5 Minuten, einmal die Nutzlast ist fertig.
Problem ist, dass meine zweite thread beendet wird, bevor die Nutzlast ist auch fertig, ohne ersichtlichen Grund, und ich kann auch nicht die Ausnahme abfangen, wie es scheint ausgelöst zu werden, die von außerhalb der Delegierten-Prozess?
Irgendwelche Vorschläge, wie das problem zu finden?
Den code....
public void StartService()
{
ThreadStart stRecieve = new ThreadStart(DownloadNewMail);
ThreadStart stSend = new ThreadStart(SendNewMail);
senderThread = new Thread(stRecieve);
recieverThread = new Thread(stSend);
sendStarted = true;
recieveStarted = true;
senderThread.Start();
recieverThread.Start();
}
private void DownloadNewMail()
{
while(recieveStarted)
{
//Payload....
if (recieveStarted)
{
Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0));
}
}
}
private void SendNewMail()
{
while(sendStarted)
{
//Payload....
if (sendStarted)
{
Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0));
}
}
}
- Ein
StackOverflowException
ist oft verursacht durch recursing zu tief ist, oder durch Rundschreiben Instanziierungen. Verwenden Sie die Rekursion irgendwo? - "jeder thread loops für immer"<--post, dass der code hier
- Haben es geschafft, zu lösen, indem Sie die Fäden als statische...
- das klingt wie begraben das problem anstatt es zu beheben...
- Ich bin mir ziemlich sicher, dass das nicht eine Rekursion problem, als die Ausnahme ausgelöst wird, auf die erste Instanz? werde versuchen und poste den code später. tx für das Interesse bisher. Zu viel paste ist, schneiden Sie es nach unten, um die Größe...
- de Jader, code gepostet von Ihr, funktioniert einwandfrei. Möglicherweise ist das problem in der "//Nutzlast..." - block oder irgendwo anders...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun Sie utlize schwere-Gewicht-Bibliothek für Aufgaben wie DownloadNewMail und SendNewMail? Zum Beispiel habe ich festgestellt StackOverflows, wenn große Aufträge mit Microsoft.SqlServer.Dts.- Laufzeit.Paket. Versuchen Sie, die gleichen workload sequenziell innerhalb einer Kommandozeilen-Anwendung, um zu sehen, ob das Problem weiterhin besteht.
Versuchen, zu prüfen, callstack, Länge in Ihrem code:
Wenn Sie Schwierigkeiten haben, folgenden Sie den Fluss Ihrer Anwendung code-Ausführung, versuchen Sie die Protokollierung der Eingang von Methoden, die mit einem timestamp und threadid.
Können, können Sie auch nicht fangen die Ausnahme, da es eine StackOverflowException.
Siehe msdn: "Beginnen Sie mit dem .NET Framework, version 2.0, ein StackOverflowException-Objekt kann nicht gefangen werden, durch einen try-catch-block und der entsprechende Prozess wird standardmäßig beendet. Folglich werden die Benutzer empfohlen, schreiben Ihren code zu erkennen und zu verhindern, dass ein stack-überlauf. Zum Beispiel, wenn Ihre Anwendung hängt davon ab, Rekursion, verwenden Sie einen Zähler oder einen Zustand zu beenden, die rekursive Schleife. "