2010-12-15 1 views
7

को यह समझाना मुश्किल स्थिति है। एक सेवा प्रक्रिया है जो 2 थ्रेड शुरू करती है, प्रत्येक थ्रेड हमेशा के लिए लूप करता है लेकिन पेलोड समाप्त होने के बाद प्रत्येक बार 5 मिनट तक सो जाता है।प्रक्रिया समाप्त हो जाता है कारण StackOverflowException

समस्या यह है कि मेरा दूसरा धागा पेलोड भी समाप्त होने से पहले समाप्त हो गया है, कोई स्पष्ट कारण नहीं है, और मैं अपवाद नहीं पकड़ सकता क्योंकि यह प्रतिनिधि प्रक्रिया के बाहर से ट्रिगर होता है?

कैसे समस्या को खोजने के लिए पर कोई सुझाव?

कोड ....

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

एक 'StackOverflowException' अक्सर बहुत गहरा, या परिपत्र instantiations द्वारा recursing के कारण होता है। क्या आप कहीं भी रिकर्सन का उपयोग कर रहे हैं? – LukeH

+5

"प्रत्येक थ्रेड हमेशा के लिए loops" <- उस कोड को यहां पोस्ट करें –

+0

हैव इसे स्थिर के रूप में धागे बनाकर हल करने में कामयाब रहे हैं ... –

उत्तर

4

Do आप DownloadNewMail और SendNewMail जैसे कार्यों के लिए किसी भी भारी-वजन लाइब्रेरी का उपयोग करते हैं? उदाहरण के लिए, Microsoft.SqlServer.Dts.Runtime.Package का उपयोग करके बड़ी नौकरियां चलाते समय मुझे स्टैक ओवरफ्लो का सामना करना पड़ा। यह मुद्दा देखने के लिए कि क्या समस्या बनी रहती है, कमांड लाइन अनुप्रयोग के अंदर अनुक्रमिक रूप से वही वर्कलोड चलाने का प्रयास करें।

+0

जैसा कि सुझाव दिया गया है कि पेलोड एक साधारण थ्रेडिंग चीज़ के लिए बहुत भारी लगता है। मैं इसके बजाय Quatz नौकरियों को देख रहा हूँ ... हालांकि ऐसा लगता है कि .NET 4.0 में इसका उपयोग करने में कोई समस्या है –

6

यदि आपको अपने आवेदन के कोड निष्पादन के प्रवाह को निम्नलिखित हो रही है, एक टाइमस्टैम्प के साथ तरीकों के प्रवेश द्वार प्रवेश करने का प्रयास और threadid।

इसके अलावा, आप अपवाद नहीं पकड़ सकते क्योंकि यह एक स्टैक ओवरफ्लो एक्सेप्शन है।

एमएसडीएन देखें: ".NET Framework संस्करण 2.0 से शुरू होने पर, एक स्टैक ओवरफ्लो एक्सेप्शन ऑब्जेक्ट को एक कोशिश-पकड़ ब्लॉक द्वारा पकड़ा नहीं जा सकता है और इसी प्रक्रिया को डिफ़ॉल्ट रूप से समाप्त कर दिया जाता है। परिणामस्वरूप, उपयोगकर्ताओं को अपने कोड को पहचानने के लिए लिखने की सलाह दी जाती है और अपने कोड में callstack लंबाई की जाँच करने के एक ढेर अतिप्रवाह रोकने उदाहरण के लिए, यदि आपके आवेदन प्रत्यावर्तन पर निर्भर करता है, एक काउंटर या एक राज्य शर्त का उपयोग पुनरावर्ती पाश समाप्त करने के लिए "

+4

"वाह ... लोगों StackOverflowExceptions पकड़ने गया पुनरावर्ती छोरों से बाहर तोड़ ?!" –

8

प्रयास करें:।।

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!!!!"); 
    } 
}