2010-12-15 5 views
7

Cette situation est difficile à expliquer. Avoir un processus de service qui démarre 2 threads, chaque thread boucle pour toujours mais dort pendant 5 minutes chacun une fois que la charge est terminée.Le processus est terminé en raison de StackOverflowException

Problème est que mon deuxième thread se termine bien avant que la charge est même terminée, sans raison apparente, et je ne peux pas non plus attraper l'exception car elle semble être déclenchée en dehors du processus de délégation?

Des suggestions sur comment trouver le problème?

Le 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)); 
    } 
    } 

}

+6

Une erreur 'StackOverflowException' est souvent provoquée par des récursions trop profondes ou par des instanciations circulaires. Utilisez-vous la récursivité n'importe où? – LukeH

+5

"chaque thread boucle pour toujours" <- publiez ce code ici –

+0

J'ai réussi à le résoudre en créant les threads comme statiques ... –

Répondre

4

Do vous utilisez une bibliothèque lourde pour des tâches telles que DownloadNewMail et SendNewMail? Par exemple, j'ai rencontré StackOverflows lors de l'exécution de gros travaux en utilisant Microsoft.SqlServer.Dts.Runtime.Package. Essayez d'exécuter la même charge de travail de manière séquentielle dans une application de ligne de commande pour voir si le problème persiste.

+0

Comme suggéré, la charge utile semble très lourde pour un simple threading. Je regarde plutôt les jobs Quatz ... Bien qu'il semble qu'il y ait un problème à l'utiliser dans .NET 4.0 –

6

Si vous rencontrez des difficultés à suivre le flux de l'exécution de code de votre application, essayez de vous connecter à l'entrée des méthodes avec un horodatage et ThreadID.

En outre, vous ne pouvez pas intercepter l'exception car il s'agit d'une exception StackOverflowException. See msdn: «À partir de .NET Framework version 2.0, un objet StackOverflowException ne peut pas être intercepté par un bloc try-catch et le processus correspondant est arrêté par défaut. éviter un débordement de pile Par exemple, si votre application dépend de récursivité, utilisez un compteur ou une condition d'état de mettre fin à la boucle récursive "

+4

Je me souviens avoir vu ce post sur MSDN et pensais "wow ... les gens attrapaient StackOverflowExceptions pour sortir des boucles récursives?!" –

8

Essayez de vérifier callstack longueur dans votre code:..

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Hop(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception - {0}", e); 
     } 
    } 

    static void Hop() 
    { 
     CheckStackTrace(); 
     Hip(); 
    } 

    static void Hip() 
    { 
     CheckStackTrace(); 
     Hop(); 
    } 

    static void CheckStackTrace() 
    { 
     StackTrace s = new StackTrace(); 
     if (s.FrameCount > 50) 
      throw new Exception("Big stack!!!!"); 
    } 
} 
Questions connexes