2011-02-25 23 views
7

मैं एक एनीमेशन दिखा रहा हूं जबकि मेरा नियंत्रण डेटा लोड कर रहा है। जब धागा खत्म होता है, तो मैं एनीमेशन छुपाता हूं और नियंत्रण दिखाता हूं। तो मैं एक धागे से इस कोड को क्रियान्वित कर रहा हूँ:Control.Invoke() एप्लिकेशन को लटकता है

protected void InvokeEnableBackControl() 
{ 
    if (this.InvokeRequired) 
    {     
     this.Invoke(new OpHandler(EnableBackControl)); 
    } 
    else 
    { 
     EnableBackControl(); 
    } 
} 

कभी कभी, जब मैं इस कोड का निष्पादन, मुख्य थ्रेड निम्नलिखित कोड में फांसी पर लटका दिया जाता है:

protected virtual void EnableBackControl() 
{ 
    if (overlayAnimation.TargetControl != null) 
    { 
     overlayAnimation.TargetControl.BringToFront(); 
    } 

    overlayAnimation.SendToBack(); 
    overlayAnimation.Enabled = false; 
    overlayAnimation.Visible = false;      

}

मैं मुझे यकीन नहीं है कि यह Enable या Visible संपत्ति को सेट किया गया है। क्या आप किसी भी परिस्थिति को जानते हैं जो इन गुणों को Control.Invoke से कॉल करने वाले एप्लिकेशन को सौंप सकता है?

+0

देख कई बार जब यह लटकी हुई है के लिए एक discernable पैटर्न है? –

+0

@ नहीं, केवल "कभी-कभी"। कष्टप्रद। –

+0

स्टैक ट्रेस पोस्ट करने के बाद * सटीक * कथन को लटकता है। –

उत्तर

15

ध्यान दें कि Control.Invoke तुल्यकालिक है, इसलिए यह EnableBackControl() पर वापस आने के लिए प्रतीक्षा करेगा। Control.BeginInvoke का उपयोग करने पर विचार करें, जिसे आप "आग और भूल सकते हैं।"

इस जवाब देखें: What's the difference between Invoke() and BeginInvoke()

3

डीबग में चलाएं, ऐप लटकाएं और फिर विजुअल स्टूडियो में डीबग रोकें और थ्रेड का निरीक्षण करें।

+0

यह किस तरह का जवाब है? मैंने डीबगर के साथ प्रक्रिया को संलग्न किया, मैंने धागे को रोका और निरीक्षण किया। यही कारण है कि मुझे पता है कि धागा कोड के पहले ब्लॉक में है, और मुख्य धागा दूसरे में है। –

+0

@ Daniel Peñalba यह एक तरह का समाधान है जो मेरी मदद करता है। क्योंकि जब आप ऐसा करते हैं तो आप सटीक रेखाएं देख सकते हैं जहां थ्रेड लटकता है। – Andrey

+0

मैंने ऐसा किया। जब मैं सभी धागे तोड़ता हूं तो हाइलाइट की गई रेखा 'ओवरलेएनीमेशन। दृश्यमान = झूठी;' लेकिन आमतौर पर विजुअल स्टूडियो (लगभग 2003) पिछली पंक्ति में बंद हो जाती है। केवल कभी-कभी, यही कारण है कि मुझे यकीन नहीं है कि वह रेखा या पिछली है। –

7

मैं जब मैं एक पृष्ठभूमि धागे पर .Invoke को क्रियान्वित कर रहा हूँ, जबकि मेरी मुख्य थ्रेड अभी भी व्यस्त है इससे पहले कि समस्याएं आ गया है - इस धारणा है कि एप्लिकेशन लटका दिया जाता है देता है, क्योंकि इंद्रधनुष बस वहां बैठता है, मुख्य धागे का जवाब देने के लिए इंतजार कर रहा है कि वह ध्यान दे रहा है। संभावित कारण:

  • आपका मुख्य थ्रेड अवरुद्ध है कुछ के लिए इंतज़ार कर
  • आपका मुख्य रूप वर्तमान में एक मॉडल संवाद था, तो यह नए अनुरोधों
  • आपका मुख्य थ्रेड स्पिन हो रही है बात नहीं सुन रहा है, या तो लगातार अगर जाँच कुछ खत्म हो गया है या नया काम कर रहा है। मेरे मामले में, मुख्य धागे ने पहली बार एक तंग लूप में पृष्ठभूमि धागे कताई बिताई, इसलिए यह पृष्ठभूमि धागे से किसी भी .voke अनुरोधों को नहीं सुन रहा था।

जब आप डीबगर संलग्न करते हैं, तो आपका मुख्य नियंत्रण संदेशपंप धागा क्या कर रहा है, इस पर विशेष ध्यान दें - मुझे संदेह है कि आपकी परेशानी का कारण आपकी परेशानी का कारण है। यदि आप पहचानते हैं कि यह आपके मुख्य थ्रेड में एक कसौटी लूप है जो प्रतिक्रिया नहीं दे रहा है, तो लूप में .DoEvents डालने का प्रयास करें, जो निष्पादन को रोक देगा और मुख्य थ्रेड को संदेश पंप को खाली करने और किसी भी उत्कृष्ट अनुरोध को रूट करने के लिए मजबूर करेगा।

+0

धन्यवाद, यह मेरा मामला था, और एप्लिकेशन। डॉवेंट्स() ने चाल की। – Tate

0

मुझे पता चला कि नियंत्रण की वास्तविक ड्राइंग/पेंटिंग काफी धीमी हो सकती है, अगर आपके पास उनमें से बहुत सारे हैं और/या चिकनी रीफ्रेश के लिए डबल बफरिंग का उपयोग करते हैं। मैं एक सॉकेट से प्राप्त डेटा से एक सूची दृश्य नियंत्रण अद्यतन करने के लिए BeginInvoke का उपयोग कर रहा था। कभी-कभी अपडेट इतनी तेजी से हो रहे थे कि यह ऐप को ठंडा कर रहा था। मैंने सॉकेट एसिंक में प्राप्त सब कुछ लिखकर इसे हल किया, और उसके बाद डेटा को हटाने और का उपयोग करके एक अलग थ्रेड में और एंडअपडेट सूचीदृश्य पर और सभी उत्कृष्ट अपडेट्स के बीच में किया गया। इसने अतिरिक्त निकासी के एक टन काट दिया और ऐप को बहुत अधिक उत्तरदायी बना दिया।

0

आप BeginInvoke inested Invoke उपयोग करने के लिए इस Link

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