2012-01-04 17 views
9

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

+2

एमएसडीएन पर एमएस उत्तर "अंत में, डब्ल्यूपीएफ के थ्रेडिंग मॉडल को थ्रेड एफ़िनिटी के साथ एकल थ्रेडेड निष्पादन के मौजूदा उपयोगकर्ता 32 थ्रेडिंग मॉडल के साथ सिंक में रखा गया था। इसका प्राथमिक कारण इंटरऑपरेबिलिटी - ओएलई 2.0, क्लिपबोर्ड, इंटरनेट एक्सप्लोरर को सभी को सिंगल थ्रेड एफ़िनिटी (एसटीए) निष्पादन की आवश्यकता होती है। " – Andy

उत्तर

11

MSDN प्रति संक्षिप्त विवरण

WPF के सूत्रण मॉडल धागा आत्मीयता के साथ एकल लड़ी निष्पादन की मौजूदा User32 सूत्रण मॉडल के साथ सिंक में रखा गया था। इस के लिए प्राथमिक कारण था अंतर - OLE 2.0, क्लिपबोर्ड और इंटरनेट एक्सप्लोरर जैसे सिस्टम सभी एकल थ्रेड की आवश्यकता होती है आत्मीयता (एसटीए) निष्पादन

लंबा वर्णन यह है:

अधिकांश डब्ल्यूपीएफ में ऑब्जेक्ट्स डिस्पैचर ऑब्जेक्ट से निकलती हैं, जो समेकन और थ्रेडिंग से निपटने के लिए बुनियादी संरचनाएं प्रदान करती है। डब्ल्यूपीएफ प्रेषक द्वारा लागू एक संदेश प्रणाली के आधार पर है। यह परिचित Win32 संदेश पंप की तरह काम करता है; वास्तव में, डब्ल्यूपीएफ प्रेषक क्रॉस थ्रेड कॉल करने के लिए उपयोगकर्ता 32 संदेशों का उपयोग करता है।

WP12 में समेकन पर चर्चा करते समय समझने के लिए वास्तव में दो मूल अवधारणाएं हैं - प्रेषक और थ्रेड एफ़िनिटी।

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

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

आप पूरा लेख here

व्यक्तिगत तौर पर मैं ताला और धागा तुल्यकालन तकनीक का उपयोग करने के लिए अधिक पसंद करते हैं WPF के एकल पिरोया मॉडल पढ़ सकते हैं।Dispatcher का उपयोग मुख्य यूआई थ्रेड पर different priority levels पर संदेशों को पास करने के लिए किया जा सकता है, जो कि छोटी पृष्ठभूमि प्रक्रियाओं का अधिक ख्याल रखता है, और यदि आपको किसी भी भारी प्रसंस्करण की आवश्यकता है तो आप इसके लिए अपना खुद का पृष्ठभूमि धागा बना सकते हैं।

3

डब्ल्यूपीएफ, वस्तुतः सभी यूआई टूलकिट की तरह, एक संदेश लूप पंप करके काम करता है। चूंकि संदेश किसी भी समय आ सकते हैं और किसी भी नियंत्रण को प्रभावित कर सकते हैं, आपको वैश्विक लॉक की आवश्यकता होगी। और इसे कम त्रुटि प्रवण बनाने के लिए आप शायद एक ऐसा फ़ंक्शन चाहते हैं जो लॉक के नीचे एक प्रतिनिधि को बुलाए। इस तरह शायद कुछ:

Dispatcher.Invoke(Delegate, Object()) 

तथ्य यह है कि यह बजाय एक वैश्विक ताला प्राप्त करने के यूआई धागा करने के लिए मार्शल हो जाता है सिर्फ एक कार्यान्वयन विस्तार है।

+2

तो वास्तव में संक्षिप्त जवाब यह है कि डब्ल्यूपीएफ डेवलपर्स के लिए एक चमकदार दोस्ताना इंटरफेस के साथ पुरानी विरासत सामग्री पर बनाया गया है। इसलिए एसटीए मॉडल। – Andy

+0

+1। विपणन debunked! –

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