2009-05-14 17 views
10

मैं इस त्रुटि मिल रही है? क्या यह अंग्रेजी में है? क्या माता-पिता जमे हुए हैं, या यह सिर्फ ठंडा है? माता-पिता को फ्रीज करने योग्य बनाने का कोई भी तरीका, अगर यह त्रुटि दूर हो जाता है?माता-पिता को फ्रीज करने योग्य क्या है? इस त्रुटि का मतलब क्या है?</p> <p>एक DependencyObject कि अपनी मूल से एक अलग धागा Freezable</p> <p>क्या है कि इसका मतलब यह है के अंतर्गत आता है का उपयोग नहीं कर सकता:

क्या हो रहा है:

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

अपवाद मुख्य रन विधि में पकड़ा गया है, और यह एक अवैधऑपरेशन अपवाद है।

मैं यहां स्ट्रॉ पर पकड़ रहा हूं। मैं कहाँ से प्रारम्भ करूँ?

संपादित करें: यह कॉल जिससे समस्या हो रही की तरह लग रहा है इस एक:

 if (imagePanel.InvokeRequired) 
     { 
      imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{ 
       imagePanel.ClearImages(); 
      })); 
     } 
     else 
     { 
      imagePanel.ClearImages(); 
     } 

मैं अभी भी यह ट्रैकिंग कर रहा हूँ नीचे; यदि लाइनों की उस श्रृंखला की टिप्पणी की जाती है, तो दुर्घटना अभी भी होती है, और थ्रेड स्थिति में 'बस समाप्त' धागा होता है (इसलिए कचरा संग्रहण धारणा)।

+1

कुछ मामलों में जहां एक वाक्य आरेखण मददगार होगा में से एक .. –

+1

बेहद खराब शीर्षक शब्द। कोई भी प्रासंगिक खोजशब्द खोजकर कोई भी प्रश्न नहीं ढूंढ सकता, क्योंकि शीर्षक में कोई भी नहीं है। यह एक समर्थन मंच नहीं है, अपने प्रश्नों को सही तरीके से तैयार करें ... – Timwi

+1

अरे @ टिमवी, उत्तर पढ़ें। यह समझें कि मैंने केवल इस सवाल को छोड़ दिया क्योंकि मुझे जवाब मिला, लेकिन यह बेहद निराशाजनक था। यदि आप शीर्षक संपादित करना चाहते हैं, तो अधिक प्रतिनिधि प्राप्त करें और यह स्वयं के लिए करें कि आपको यह कैसा लगता है कि यह होना चाहिए। – mmr

उत्तर

12

ठीक है, मैंने इसे समझ लिया है। आम तौर पर, मैं सिर्फ इस सवाल को हटा दूंगा, लेकिन इसे ठीक करने के तरीके के बारे में कोई जानकारी ढूंढना दर्द था।

ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    button.background = theBrush; 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
    button.background = theBrush; 
    })); 
} 

लेकिन:

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

तो, टेक-घर सबक है, यदि आप एक ImageBrush घोषित, तो यह एक ही धागे में, हटाने इसलिए की तरह:

void MyFunc(){ 
    ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 
    button.background = theBrush; 
} 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    MyFunc(); 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
     MyFunc(); 
    })); 
}