मैं वर्तमान में बड़े पैमाने पर असीमित अनुप्रयोग पर काम कर रहा हूं जो पूरे टीएपी का उपयोग करता है। Task
एस के लिए विधियों के हर तरीके में TaskScheduler
भी इंजेक्शन दिया गया है। यह हमें कार्यों की स्पष्ट शेड्यूलिंग करने की अनुमति देता है, जैसा कि मैं समझता हूं, माइक्रोसॉफ्ट एसिंक सीटीपी के साथ नहीं जा रहा है।Async सीटीपी - कार्य शेड्यूलिंग के लिए अनुशंसित दृष्टिकोण
मेरे पास नए दृष्टिकोण (अंतर्निहित शेड्यूलिंग) के साथ एकमात्र मुद्दा यह है कि हमारा पिछला दर्शन हमेशा रहा है "हम जानते हैं कि निरंतरता हमेशा अपना कार्य शेड्यूलर निर्दिष्ट करेगी, इसलिए हमें इस बात की चिंता करने की आवश्यकता नहीं है कि हम किस संदर्भ को पूरा करते हैं पर कार्य "।
इससे दूर जाने से हमें थोड़ी चिंता होती है क्योंकि सूक्ष्म थ्रेडिंग त्रुटियों से बचने के मामले में यह बहुत अच्छी तरह से काम करता है, क्योंकि कोड के हर बिट के लिए हम देख सकते हैं कि कोडर को यह समझने के लिए याद किया गया है कि वह किस धागे पर है। यदि वे कार्य शेड्यूलर निर्दिष्ट करने से चूक गए हैं, तो यह एक बग है।
प्रश्न 1: क्या कोई मुझे आश्वस्त कर सकता है कि अंतर्निहित दृष्टिकोण एक अच्छा विचार है? मुझे कॉन्फ़िगरएवाइट (झूठी) और लीगेसी/थर्ड पार्टी कोड में स्पष्ट शेड्यूलिंग द्वारा कई मुद्दों को पेश किया जा रहा है। मैं कैसे सुनिश्चित कर सकता हूं कि मेरा 'प्रतीक्षा-कोड' कोड यूआई थ्रेड पर हमेशा चल रहा है, उदाहरण के लिए?
प्रश्न 2: तो, यह सोचते हैं कि हम अपने कोड से सभी TaskScheduler
डि हटाने और निहित निर्धारण का उपयोग करने के लिए शुरू, हम कैसे तो डिफ़ॉल्ट कार्य अनुसूचक सेट करूँ? किसी विधि के माध्यम से शेड्यूलर मिडवे को बदलने के बारे में क्या, एक महंगी विधि का इंतजार करने से पहले, और उसके बाद इसे फिर से वापस सेट करना?
(पश्चलेख मैं पहले से ही http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/configuring-waiting.aspx पढ़ा है)
ग्रेट उत्तर स्टीफन, लेकिन स्पष्टीकरण के लिए: अगर कॉन्फ़िगरएवाइट (झूठा) आंतरिक रूप से एसिंक विधि 'ए' द्वारा उपयोग किया जाता है, तो यदि मैं विधि 'ए' का इंतजार कर रहा हूं तो मैं किस संदर्भ में होने की उम्मीद करता हूं? थ्रेडपूल, या विधि 'ए' के लिए एक प्रतीक्षा कॉल करने से पहले मूल संदर्भ फिर से शुरू होगा? –
स्टीफन का जवाब काफी ठोस है। नोट, यदि आप अपने पुराने मॉडल पर मृत सेट हैं, तो आप हमेशा एक कस्टम रैपर का इंतजार कर सकते हैं (इसी तरह कॉन्फ़िगरएवाइट() काम करता है) और इसे कार्य/कार्य पर एक विस्तार विधि के रूप में हुक करें। उदाहरण के लिए, यदि आपकी एक्सटेंशन विधि को ResumeOn (TaskScheduler ts) कहा जाता है, तो कोड इस तरह दिख सकता है: फ़ू (...) का इंतजार करें। ResumeOn (ts); और फिर अपने स्वयं के कोड के रूप में सभी समान शेड्यूलिंग अर्थशास्त्र हैं, लेकिन सभी उन्नत प्रवाह/निष्पादन भलाई के साथ 'प्रतीक्षा' लाता है। –
@ लॉरेंस: एसिंक विधियों की प्रत्येक "परत" इसके संदर्भ को पास करती है, लेकिन ऊपर नहीं। इसलिए यदि 'ए' 'कॉन्फ़िगरएवाइट (झूठी)' कहता है, तो यह थ्रेड पूल पर चलना समाप्त हो जाएगा। फिर, जब 'बी' कॉल 'ए() 'का इंतजार करता है, तो' बी '' प्रतीक्षा' के बाद * अपने * मूल संदर्भ में फिर से शुरू होगा। तथ्य यह है कि थ्रेड पूल पर 'ए' खत्म होने पर 'बी' के शेष पर कोई प्रभाव नहीं पड़ता है। –