2010-01-21 16 views
6
  • डब्ल्यूपीएफ व्यू में बंधे संग्रह यूआई थ्रेड पर अपडेट किए जाने चाहिए।
  • ViewModel एक संग्रह को उजागर करता है
  • इसलिए जब ViewModel में संग्रह संशोधित किया गया है यह यूआई धागा
  • सर्वश्रेष्ठ अभ्यास डिस्पैचर के रूप में ViewModels देखें से अनभिज्ञ और संभवतः ऐसी जानकारी रखने के लिए है में किया जाना चाहिए।

दृश्य मॉडल को टेस्ट करने योग्य रखने के दौरान इसे हल करने का सबसे साफ तरीका क्या है?यूआई थ्रेडिंग व्यूमोडल्स

उत्तर

1

आप सही हैं कि WPF हमें बहु-थ्रेडिंग सरल बनाने के लिए Dispatcher देता है; लेकिन यदि आप एमवीवीएम पैटर्न के साथ चिंताओं को अलग करना चाहते हैं, तो आपको एक अलग थ्रेडिंग रणनीति को लागू करने की आवश्यकता होगी।

मुझे हमेशा यूआई थ्रेड पर अपडेट को धक्का देने के लिए BackgroundWorker कक्षा को अधिक से अधिक मिला है, ताकि आप वीएम में ObservableCollection अपडेट कर सकें और दृश्य में प्रसारित हो सकें।

3

यहां एक विकल्प है ViewModel के भीतर से SynchronizationContext उपयोग करने योग्य है। यह पृष्ठभूमि है जो पृष्ठभूमि वर्कर क्लास यूपी के साथ सिंक्रनाइज़ करने के लिए उपयोग करता है, बिना डब्ल्यूपीएफ या विंडोज फॉर्म पर निर्भरता पेश किए, और इसे कई तकनीकों के साथ काम करने की इजाजत देता है।

यह आपको यूआई के संदर्भ में बिना किसी संदर्भ के यूआई थ्रेड पर मार्शल वापस करने की अनुमति देगा, जिसमें डिस्पैचर भी शामिल है।

+0

कोई बुरा विचार नहीं है, लेकिन मुझे सिंककॉन्टेक्स्ट की लचीलापन, इस पर निर्भरता लेने के प्रभाव आदि के बारे में आश्चर्य है ... कोई विचार? – Schneider

+0

इसमें "कम से कम आम संप्रदाय" है, लेकिन भेजें() और पोस्ट() आवश्यक कार्यक्षमता प्रदान करते हैं, और यह किसी विशिष्ट ढांचे पर निर्भरता को मजबूर नहीं करता है। जैसा कि मैंने उल्लेख किया है, इस प्रकार पृष्ठभूमिवर्कर निर्भरता के बिना WPF + Win FOrms के साथ काम कर सकता है। –

0

एक विकल्प ऑब्जर्वेबल कोलेक्शन का उप-वर्ग बनाना है जो ऑनप्रॉपर्टी चेंज और ऑनकॉलक्शन को ओवरराइड करता है और उपयुक्त घटनाओं को यूआई थ्रेड (सिंक्रनाइज़ेशन कॉन्टेक्स्ट जैसे कुछ के माध्यम से) भेजता है।

यह थ्रेडिंग की बात करते समय व्यूमोडेल को अधिक अज्ञेयवादी होने की अनुमति देता है, यह परीक्षण के तहत कोड को प्रबंधित करने में बहुत आसान बनाता है।

+0

मुझे इस समस्या के सामान्य समाधानों से अवगत है ... मेरा प्रश्न विशेष रूप से एमवीवीएम के बारे में है और पूरी तरह से इस तरह की चीज़ों के व्यूमोडेल को स्पष्ट रखता है। अब तक इसे वीएम की तरह दिखने की आवश्यकता है सिंक/थ्रेडिंग – Schneider

+0

का ज्ञान होना चाहिए, आप पूरी तरह से ViewModel से थ्रेडिंग के ज्ञान को हटाने में सक्षम नहीं होंगे। लेकिन यह बेस व्यूमोडेल और ऑब्जर्जेबल कोलेक्शन के उप-वर्ग द्वारा "छुपा" हो सकता है। ऐसा करके ViewModel (उदाहरण के लिए ViewAccountsViewModel) थ्रेडिंग के बारे में अज्ञेयवादी होगा और इसलिए बहुत अधिक टेस्टेबल होगा। –

1

यह देखने योग्य/हटाने/अद्यतन करने के अपने सभी तर्कों को सारणित करके हल किया गया है + किसी अन्य जटिल तर्क जो आपके परिदृश्य में विभिन्न धागे पर होता है।

यह नियंत्रक वर्ग सही थ्रेड पर व्यूमोडेल (यह इंटरफ़ेस द्वारा वीएम का संदर्भ हो सकता है) को अपडेट करने के लिए ज़िम्मेदार हो सकता है।

+1

एक और विस्तृत उदाहरण देने के लिए देखभाल? – Schneider

+0

स्टैक ओवरफ़्लो में करना मुश्किल है। आप एक नियंत्रक वर्ग की कल्पना कर सकते हैं जिसमें मॉडल के साथ सभी जटिल बातचीत है। इस नियंत्रक की संपत्ति के रूप में, बाध्यकारी के लिए ViewModel है।नियंत्रक यूआई थ्रेड के लिए विभिन्न धागे, मार्शल पर डेटा पर प्रतिक्रिया कर सकता है और फिर केवल व्यूमोडेल पर गुण सेट कर सकता है क्योंकि इसका संदर्भ है। इसके अलावा, व्यूमोडेल पर निष्पादित किए गए किसी भी आदेश को कंट्रोलर पर ईवेंट के माध्यम से प्रचारित किया जा सकता है, इसके लिए कार्रवाई को किसी अन्य थ्रेड पर धक्का देना (यदि आवश्यक हो) –

+1

वेब पर ऐसे मॉडल व्यूव्यूमोडेल नियंत्रक के कई उदाहरण नहीं हैं, लेकिन ऐसा लगता है जैसे इसकी क्षमता है – Schneider

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