2010-09-04 12 views
6

डब्ल्यूपीएफ में हमारे पास दो धागे हैं (कम से कम): प्रतिपादन और यूआई थ्रेड। जब मैं कुछ संपत्ति परिवर्तनों पर OnNotifyPropertyChanged कोई ईवेंट उठाता हूं, तो यह UI थ्रेड पर उठाया जाता है। इस जानकारी को पुन: प्रस्तुत करने के लिए WPF प्रतिपादन धागे को प्रेषित करने की आवश्यकता है। मुझे लगता है कि यह एक तुल्यकालिक तरीके से किया जाता है (Dispatcher.Invoke) लेकिन यह वास्तव में कैसे काम करता है?INotifyPropertyChanged: दृश्य के पीछे क्या होता है?

यदि मैं इस डेटा संरचना के लिए एक्सेसर प्रॉपर्टी तक पहुंच को लॉक किए बिना एक ही डेटा स्ट्रक्चर के लिए एकाधिक ऑन नॉटिफ़ाईप्रॉपर्टी चेंजेड इवेंट्स बढ़ाता हूं जिसके लिए इन घटनाओं को उठाया गया है, तो क्या मैं संभावित दौड़ की स्थिति बना रहा हूं? मैंने कुख्यात "संग्रह संशोधित किया है; डब्ल्यूपीएफ से आने वाले अपवाद" गणना निष्पादित नहीं हो सकती है, इसलिए ऐसा लगता है कि डब्ल्यूपीएफ इन घटनाओं को असंकालिक रूप से संसाधित करता है। क्या मैं अपवाद को गलत समझ रहा हूं? धन्यवाद!

+0

आप इसे फिर से बनाने के लिए नमूना क्यों नहीं पोस्ट करते? कुछ संग्रहों को प्रदर्शित करने की तरह, जिन्हें आप अक्सर कुछ डिस्पैचर टिमर ईवेंट से बदलते हैं। –

उत्तर

0

आशा है जब आप दो धागे बात कर रहे हैं, तो आप

  1. बात कर रहे हैं धागा
  2. यूआई थ्रेड प्रतिपादन।

हाँ, आप कर रहे हैं सही अद्यतन एक Asynch

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

+0

गुरु, यह कहां कहता है कि डब्ल्यूपीएफ प्रक्रियाओं को सूचित करता हैप्रॉपर्टी घटना को असंकालिक रूप से बदलता है? – Lenik

1

अपवाद पर एक नजर डालें कि "संग्रह संशोधित किया गया था; गणन किए गए कार्य पूरे नहीं हो सकता है" WPF से संबंधित नहीं है, यह उठाया है IENumerator से जब आप foreach के साथ संग्रह पर पुनरावृत्त करते हैं और ऐसा करते समय संग्रह किसी भी तरह से बदला जाता है (जोड़ें/हटाएं/संशोधित करें)। (उदाहरण: http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/) ।

इसके अलावा मुझे संपत्तिChanged ईवेंट पर एकाधिक एक साथ आक्रमण के कारण अपवाद का कभी सामना नहीं हुआ है।

+0

बिंदु यह है कि संग्रह WPF द्वारा पुनरावृत्त किया गया है और मेरे कोड द्वारा नहीं। जब मैं पहली मौका अपवाद चालू करता हूं, तो मुझे लगता है कि यह .NET – Lenik

+0

में असफल रहा है क्या अपवाद फेंक दिया गया है? –

+0

मेरा सबसे अच्छा अनुमान यह है कि यह हो रहा है क्योंकि आप xaml के लोड के दौरान संग्रह को संशोधित करते हैं। बाइंडिंग आपके आइटम्स कंट्रोल पर इसे पॉप्युलेट करने के लिए संग्रह पर फिर से प्रयास करने की कोशिश कर रही है, और साथ ही आप इसे संशोधित कर रहे हैं। इसे सिंक करने का प्रयास करें। – Captain

0

क्या आप गैर यूआई थ्रेड पर अपने स्वयं को संसाधित कर रहे हैं? मुझे पूरा यकीन है कि आपके द्वारा बाध्यकारी होने वाली किसी भी गणना के पुनरावृत्ति को यूआई थ्रेड पर किया जाएगा, इसलिए अगर आपके आवेदन में किसी और को ईवेंट को बढ़ाने के बाद संग्रह में संशोधन होता है तो आपको यह अपवाद मिल जाएगा।

समस्या आपके संग्रह पर पुनरावर्तित थ्रेड द्वारा उत्पन्न होने वाली वजह से नहीं होनी चाहिए क्योंकि यह कभी ऐसा नहीं करता है।

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