2012-06-05 9 views
11

धीरे-धीरे मैं overworked हूँ ...एप्लिकेशन विजुअल स्टूडियो के बाहर जमा हो जाता है। हालांकि यह विजुअल स्टूडियो से शुरू यह काम करता है

मैं सूत्रण, टाइमर के साथ एक विशाल अनुप्रयोग है, आह्वान (नहीं BeginInvoke, तो यह तुल्यकालिक है) और Application.DoEvents।

यहां पोस्ट करने के लिए बहुत अधिक है और मुझे नहीं पता कि समस्या वास्तव में कहां है।

मेरा हर तरीका एक कोशिश पकड़ने के अंदर है। हर पकड़ लॉग है।

यदि मैं विजुअल स्टूडियो (एफ 5) से अपना आवेदन शुरू करता हूं या चींटियों के माध्यम से इसे प्रोफाइल करते समय कोई समस्या नहीं है। आवेदन कुछ दिनों से चलता है। लेकिन जैसे ही मैं विंडोज एक्सप्लोरर के माध्यम से एक ही डीबग संस्करण शुरू करता हूं, यह हर कुछ घंटों में जमा हो जाता है। यह बिना किसी अपवाद के फ्रीज करता है। यदि मैं इस एप्लिकेशन में दृश्य स्टूडियो संलग्न करता हूं और इसे तोड़ता हूं, तो यह एप्लिकेशन पर रुक जाता है। रुन (नया फॉर्म 1());

मैं वास्तव में उलझन में हूं और इसे सुधारने का कोई विचार नहीं है।

if (grabber.InvokeRequired) 
{ 
    Console.WriteLine("grabber.InvokeRequired"); 
    this.Invoke((MethodInvoker) delegate { grabber.Navigate("http://www.google.de"); }); // <-- hang 
} 
else 
{ 
    grabber.Navigate(ig.StartUrl); 
} 

इस स्निपेट एक टाइमर घटना

_timeout = new System.Timers.Timer(10000); 
_timeout.Elapsed += new ElapsedEventHandler(OnWatchDogBark); 

संपादित का हिस्सा है:

यह एक .net 3.5 WinForms आवेदन

ऐसा लगता है कि एक धागा यहाँ लटकी हुई है

DoEvents() के लिए एक नमूना। यह एक ताला() में और एक आह्वान

grabber.DocumentCompleted -= grabber_DocumentCompleted; 
grabber.Navigate("http://www.google.de"); 

while (grabber.ReadyState != WebBrowserReadyState.Complete) 
{ 
    timeout--; 
    Application.DoEvents(); 
    Thread.Sleep(200); 

    if (timeout < 0) 
    { 
     timeout = 50; 
     grabber.Navigate("http://www.google.de"); 
    } 
} 

वर्तमान में मैं System.Windows.Forms.Timer और कुछ ताले का उपयोग लेकिन कोई सुधार है में है। !

ठीक है, मैं कुछ जानकारियां पाने के लिए

संपादित करें WinDbg प्रयोग किया है: 14.06.2012

धागे

         PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    0 1 37ec 007cab18  6020 Enabled 00000000:00000000 007c8510  0 STA System.ArgumentException (02762ba8) 
    2 2 85b8 007d7c38  b220 Enabled 00000000:00000000 007c8510  0 MTA (Finalizer) 
XXXX 3 0 06e9f548  9820 Enabled 00000000:00000000 007c8510  0 Ukn 
    21 5 3464 0d6dc598 200b020 Enabled 28cb5820:28cb5fe8 007c8510  0 MTA 
    22 6 62b0 0d6db9e0 200b220 Enabled 00000000:00000000 007c8510  0 MTA 
    23 7 8e58 0d6db5f8 80a220 Enabled 00000000:00000000 007c8510  0 MTA (Threadpool Completion Port) 
XXXX 4 0 06f62d40 1801820 Enabled 00000000:00000000 007c8510  0 Ukn (Threadpool Worker) 
XXXX f 0 132a3290 1801820 Enabled 00000000:00000000 007c8510  0 Ukn (Threadpool Worker) 
XXXX 10 0 132a3678 1801820 Enabled 00000000:00000000 007c8510  0 Ukn (Threadpool Worker) 
XXXX e 0 132a26d8 1801820 Enabled 00000000:00000000 007c8510  0 Ukn (Threadpool Worker) 
XXXX 9 0 0d6db210 1801820 Enabled 00000000:00000000 007c8510  0 Ukn (Threadpool Worker) 

DLK

Examining SyncBlocks... 
Scanning for ReaderWriterLock instances... 
Scanning for holders of ReaderWriterLock locks... 
Scanning for ReaderWriterLockSlim instances... 
Scanning for holders of ReaderWriterLockSlim locks... 
Examining CriticalSections... 
Could not find symbol ntdll!RtlCriticalSectionList. 
No deadlocks detected. 
+1

आपके हाथों में एक डेडलॉक है। हालांकि, निदान करना मुश्किल है। – zmbq

+0

मेमोरी लीक हो सकता है जो इसे मेमोरी से बाहर चलाता है [सी तेज में मेमोरी रिसाव] (http://stackoverflow.com/questions/620733/memory-leak-in-c-sharp), [कैसे-पहचान-स्मृति -लेक्स इन-सी-तेज-एप्लिकेशन] (http://stackoverflow.com/questions/2259433/how-to-detect-memory-leaks-in-c-sharp- एप्लिकेशन)? – PresleyDias

+0

यूप, zmbq के समान ही कहेंगे। आईडीई से इसे चलाने से इसे बहुत धीमा कर दिया जाता है इसलिए समरूपता से ताले होने की संभावना कम होती है। –

उत्तर

8

एक हो सकता है संभव पृष्ठभूमि धागे में ई डेडलॉक। अन्य ऐप को देखने का प्रयास करें जो आपके ऐप को अवरुद्ध कर सकता है।

Toolbar -> Debug -> Windows -> Threads 

http://msdn.microsoft.com/en-us/library/w15yf86f.aspx

से अधिक थ्रेड होनी चाहिए और एक आप लाइन जहां यह अपने अनुप्रयोग रोक रहा है देखने के लिए क्लिक करें यदि आप दोगुना।

और अगर आप अपने कोड में इस लाइन:

Control.CheckForIllegalCrossThreadCalls = false; 

यह सच करने के लिए सेट फिर से।मृत ताले के लिए एक संभावित कारण पृष्ठभूमि थ्रेड नियंत्रण नियंत्रण हैं।

इसे बैकग्राउड धागे से लिखने के बजाय।

button1.Text = "hello" 

इसे लिखें।

this.Invoke(() => button1.Text = "hello"); 
+0

धन्यवाद। धागे के साथ मुझे अपने मुख्य का संपादित हिस्सा मिला प्रश्न –

+0

आप 'Invoke' के बजाय 'BeginInvoke' का उपयोग करने का प्रयास कर सकते हैं जो कॉल को वापस आने की प्रतीक्षा नहीं करेगा, लेकिन मैं' System.Windows.Forms.Timer' का उपयोग करूंगा, आप इस कोड का उपयोग विंडोज फॉर्म संदर्भ में कर रहे हैं , है ना? विंडोज फॉर्म टाइमर टिक घटना जीयूआई थ्रेड में आग लगती है, इसलिए आपको सिंक्रनाइज़ेशन के बारे में चिंता करने की ज़रूरत नहीं है। –

+0

वर्तमान में मैं System.Windows.Forms.Timer और कुछ ताले का उपयोग करता हूं लेकिन इसमें कोई सुधार नहीं है। –

3

यदि यह ठंडा हो रहा है, तो आप शायद डेडलॉक देख रहे हैं। एक डेडलॉक खोजने के लिए मैंने पाया है कि सबसे अच्छे तरीकों में से एक क्रैश डंप और सोसेक्स का उपयोग करना है।

यहाँ इस तकनीक (यह asp.net है, लेकिन एक ही सिद्धांत लागू होते हैं) का उपयोग करने पर एक अच्छा लेख है: http://blogs.msdn.com/b/tess/archive/2010/04/27/debugging-a-classic-readerwriterlock-deadlock-with-sosex-dll.aspx

जब तक यह जमा एप्लिकेशन को चलने देने के लिए, और एक लटका डंप ले: http://blogs.msdn.com/b/tess/archive/2006/10/16/net-hang-debugging-walkthrough.aspx

0

आह्वान खतरनाक है और आसानी से अप्रत्याशित तरीके से गतिरोध मैं

साथ

this.Invoke((MethodInvoker)...

की जगह की सिफारिश करेंगे पैदा कर सकता है

this.BeginInvoke((MethodInvoker)...

जो कॉलर को अवरुद्ध नहीं करेगा और शायद समस्या का समाधान करेगा।

संपादित करें यदि आपको इसे डेडलॉक्स तक इंतजार करने की आवश्यकता नहीं है और फिर यह देखने के लिए विंडबग का उपयोग करें कि आप क्यों डेडलॉक हैं।

0

वीएस से चलते समय यह एक डीबगर थ्रेड इंजेक्ट करेगा, जो कुछ संदेश रूटिंग को बदल देगा। आपको Invoke(...) कतार में किसी संदेश पर प्रतीक्षा करने वाली किसी चीज़ पर अवरुद्ध करने में समस्या हो सकती है, लेकिन डीबगर के तहत जीत संदेशों को एक अलग क्रम में संसाधित किया जाता है।

IIUC आपको सिस्टम के साथ ताले की आवश्यकता नहीं है। Windows.Forms.Timer क्योंकि यह जीत संदेश पंप का उपयोग करता है, इसलिए टाइमर ईवेंट हमेशा जीयूआई थ्रेड पर संसाधित होते हैं (जब तक कि आपके ऐप में कुछ और थैडपूल पर कोड नहीं चला रहा हो या समर्पित पृष्ठभूमि धागे में)।

तो, आपके नमूना कोड में कुछ भी थ्रेडिंग शामिल नहीं है, जब तक कि वेब ब्राउज़र नियंत्रण पृष्ठभूमि थ्रेड पर अपनी घटनाओं को सक्रिय नहीं करता है (जिस स्थिति में यूआई थ्रेड पर वापस पोस्ट करें, BeginInvoke() के साथ)। एक बार जब आप मुख्य यूआई थ्रेड पर चल रहे सभी एप्लिकेशन नियंत्रण प्राप्त कर लें तो ताले को हटा दें (एक डिबगिंग सहायता के रूप में)। कृपया पृष्ठभूमि प्रसंस्करण और किसी भी परिणाम के बारे में अधिक जानकारी पोस्ट करें।

संबंधित मुद्दे