17

Stephen Toub blogged किक्या SynchronizationContext और TaskScheduler

दोनों SynchronizationContext और TaskScheduler पृथक्करणों हैं कि एक "अनुसूचक", कुछ है कि आप के लिए कुछ काम दे प्रतिनिधित्व करते हैं, और यह निर्धारित करता है कि कब और कहाँ करने के लिए के बीच वैचारिक अंतर नहीं है उस काम को चलाओ। शेड्यूलर के कई अलग-अलग रूप हैं। उदाहरण के लिए, थ्रेडपूल एक शेड्यूलर है: आप कॉल करने के लिए एक प्रतिनिधि को आपूर्ति करने के लिए ThreadPool.QueueUserWorkItem को कॉल करें, प्रतिनिधि कतारबद्ध हो जाता है, और थ्रेडपूल के धागे में से एक अंततः उठाता है और उस प्रतिनिधि को चलाता है। आपके यूजर इंटरफेस में शेड्यूलर भी है: संदेश पंप।

तो System.Reactive.Concurrency.EventLoopScheduler, Dispatcher, ThreadPool, TaskScheduler, SyncrhonizationContext, और IScheduler implementations of Reactive Extensions सब उस अर्थ में "शेड्यूलर" कर रहे हैं।

उनके बीच क्या अंतर है?

वे सभी आवश्यक क्यों थे? मुझे लगता है कि मुझे इवेंट लूप, डिस्पैचर, थ्रेडपूल मिलता है। Ischeduler भी अच्छी तरह से समझाया जाता है।
लेकिन टास्कशेड्यूलर और सिंक्रोननाइजेशन कॉन्टेक्स्ट अभी भी मुझे स्पष्ट नहीं है।

Stephen Cleary's excellent article सिंक्रोननाइजेशन कॉन्टेक्स्ट समझाता है, और मुझे लगता है कि मुझे यह मिल गया है। फिर हमें टास्कशेड्यूलर की आवश्यकता क्यों थी, स्पष्ट नहीं है।

कृपया किसी स्रोत को समझाएं या इंगित करें।

+0

उत्तर के सुझावों के कारण कई कारण हो सकते हैं। एक और जिसका उल्लेख अभी तक नहीं किया गया है, मैंने इस एमएसडीएन में पाया ब्लॉग आलेख: http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259082.aspx यह कहता है कि सिंक्रोननाइजेशन कॉन्टेक्स्ट.पोस्ट एसिंक्रोनस विधि कार्य आइटम निष्पादित होने पर अधिसूचना प्रदान नहीं करता है। आलेख बताता है कि कार्य को वापस करने के लिए TaskCompletionSource का उपयोग करने वाली एक एक्सटेंशन विधि को कैसे जोड़ना है। –

उत्तर

8

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

एक कार्य और एक कार्य शेड्यूलर एक कार्य के उपयोगकर्ता को इन निचले स्तरों (आप निश्चित रूप से, एक सारणीबद्ध तरीके से) शेड्यूलिंग कार्यों के बारे में सोचना नहीं चाहते हैं। आपको एक कार्य शुरू करने में सक्षम होना चाहिए और एक परिवेश "शेड्यूलर" का ख्याल रखना चाहिए। उदाहरण के लिए, TaskFactory.StartNew(()=>{LengthyOperation()}) पर ध्यान देना चाहिए कि मैं किस प्लेटफॉर्म के तहत चल रहा हूं। यही वह जगह है जहां SynchronizationContext आता है। यह जानता है कि वर्तमान में चल रहे ढांचे में निम्न स्तर के शेड्यूलर क्या शामिल हैं। यह TaskScheduler के साथ पारित किया जाता है और यह शेड्यूलर दोनों सिंक्रनाइज़ेशन आवश्यकताओं को बनाए रखने के लिए वर्तमान में चल रहे ढांचे (SynchronizationContext देखें) के साथ जुड़े निम्न-स्तर शेड्यूलर के माध्यम से कार्य निर्धारित कर सकता है (संभवतः थ्रेडपूल पर)। जैसे हालांकि आप अपने कार्य को थ्रेडपूल में चलाने के लिए चाहते हैं, तो आप यूआई थ्रेड में निरंतर चलाना चाहते हैं।

यह जानना महत्वपूर्ण है कि TaskScheduler कई अन्य शेड्यूलर का एक अमूर्त है। यह एकमात्र कारण नहीं है, लेकिन इस "अतिरिक्त" अमूर्तता के कारणों में से एक है।

+0

_SynchronizationContext अंदर आता है। यह जानता है कि वर्तमान में चल रहे फ्रेमवर्क_ में निम्न-स्तरीय शेड्यूलर क्या शामिल हैं - अगर यह जानता है कि हमें 'टास्कशेड्यूलर' क्यों चाहिए? उदाहरण के लिए: _ WindowsFormsSynchronizationContext को कतारबद्ध सभी प्रतिनिधि एक समय में निष्पादित किए जाते हैं; वे एक विशिष्ट UI थ्रेड द्वारा निष्पादित किए गए क्रम में निष्पादित किए जाते हैं ._ [स्रोत] (https://msdn.microsoft.com/en-us/magazine/gg598924.aspx) यदि कोई 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' के लिए कार्यों को शेड्यूल कर सकता है निष्पादन, फिर भी मुझे 'टास्कशेड्यूलर' की आवश्यकता नहीं दिखाई दे रही है। – user4205580

+0

_That को TaskScheduler_ के साथ पास किया जाता है - ** ** टास्कशेड्यूलर 'को ** क्या पास किया जाता है? – user4205580

+0

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

6

हालांकि, के रूप में उद्धृत,

दोनों SynchronizationContext और TaskScheduler पृथक्करणों हैं कि एक "अनुसूचक"

अमूर्त की डिग्री का प्रतिनिधित्व IMO, (और इसलिए एपीआई) अलग है। सिंक्रनाइज़ेशन कॉन्टेक्स्ट एक अधिक सामान्य एपीआई है जो एक अर्थ में है कि पोस्ट/भेजें एक साधारण विधि प्रतिनिधि लेता है।

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

सिंक्रनाइज़ेशन कॉन्टेक्स्ट .NET 2.0 में पेश किया गया था जबकि टीपीएल को .NET 4 में पेश किया गया था। यह सोचने में दिलचस्प है कि अनुक्रम दूसरे तरीके से क्या होता है यानी क्या होगा यदि यानी टीईपी एनईटी के समय मौजूद था 2.0। आईएमओ, विशिष्ट विशेषज्ञता में कार्य के रूप में delgates मॉडलिंग द्वारा SynchrinizationContext के बजाय TaskScheduler का उपयोग किया जा सकता था।

+0

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

+1

@ माइकल करिव, AFAIK, आरएक्स एफसीएल का हिस्सा नहीं है - इसकी पुस्तकालय विकसित और .NET 4 के बाद जारी की गई है। यह Fx के अगले संस्करण में जोड़ा जा सकता है या नहीं। कहा जाता है कि, मेरा मानना ​​है कि आप एक ही अवधारणा के कई अवशेषों को देख सकते हैं क्योंकि एक अवशोषण सभी परिदृश्यों के साथ बहुत अच्छी तरह से फिट नहीं हो सकता है (फिटनेस कार्यक्षमता परिप्रेक्ष्य से नहीं बल्कि इंटरफेस परिप्रेक्ष्य से फिटनेस) – VinayC

+2

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

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