2015-08-27 10 views
35

मेरे एएसपी.नेट 5 ऐप में, मैं अपने स्टार्टअप के अंदर एक कैश में कुछ डेटा लोड करना चाहता हूं। कॉन्फ़िगर विधि। Azure एसडीके विशेष रूप से async विधियों का खुलासा करता है। आमतौर पर, एक async विधि बुला एक async विधि के अंदर इंतजार के माध्यम से किया जाता है, इस तरह:मैं स्टार्टअप में कॉन्फ़िगर कैसे कर सकता हूं। कॉन्फ़िगर करें?

public async Task Configure(IApplicationBuilder app, IMemoryCache cache) 
{ 
    Data dataToCache = await DataSource.LoadDataAsync(); 
    cache.Set("somekey", dataToCache); 

    // remainder of Configure method omitted for clarity 
} 

हालांकि, ASP.NET 5 की आवश्यकता है कि कॉन्फ़िगर विधि शून्य देता है। मैं एक एसिंक शून्य विधि का उपयोग कर सकता हूं, लेकिन मेरी समझ यह है कि एसिंक शून्य विधियों का उपयोग केवल ईवेंट हैंडलर के लिए किया जाना चाहिए (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx के अनुसार कई अन्य लोगों के बीच)।

मैं सोच रहा था कि यह करने के लिए एक बेहतर तरीका है इस तरह Task.Results संपत्ति के माध्यम से इंतजार बिना async समारोह कॉल करने के लिए, लौटे टास्क पर रुको कहते हैं, तो कैश परिणाम, होगा:

public void Configure(IApplicationBuilder app, IMemoryCache cache) 
{ 
    Task<Data> loadDataTask = DataSource.LoadDataAsync(); 
    loadDataTask.Wait(); 
    cache.Set("somekey", loadDataTask.Result); 

    // remainder of Configure method omitted for clarity 
} 

स्टीफन वाल्थर ने इस वर्ष की शुरुआत में blog post में एक समान दृष्टिकोण का उपयोग किया था। हालांकि, यह उस पोस्ट से अस्पष्ट है अगर इसे स्वीकार्य अभ्यास माना जाता है। क्या यह?

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

+1

यह एक दिलचस्प सवाल है। मुझे नहीं पता लेकिन मुझे लगता है * इस मामले में * async शून्य का कोई दुष्प्रभाव नहीं है। उम्मीद है कि अधिक अनुभव वाला कोई जवाब दे सकता है। –

+0

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

उत्तर

0

आप कुछ असीमित काम कर सकते हैं, लेकिन विधि तुल्यकालिक है और आप इसे बदल नहीं सकते हैं। इसका मतलब है कि आपको एसिंक कॉल पूरा होने के लिए सिंक्रनाइज़ रूप से प्रतीक्षा करने की आवश्यकता है।

यदि स्टार्टअप अभी तक समाप्त नहीं हुआ है, तो आप स्टार्टअप विधि से वापस नहीं आना चाहते हैं, है ना? आपका समाधान ठीक लगता है।

अपवाद हैंडलिंग के लिए: यदि कोई ऐसा काम है जो आपका एप्लिकेशन बिना ठीक से चलाया जा सकता है, तो आपको स्टार्टअप विधि विफल होनी चाहिए (Fail-fast देखें)। यदि यह कुछ महत्वपूर्ण नहीं है तो मैं कोशिश करने वाले ब्लॉक में प्रासंगिक भाग संलग्न करूँगा और बाद में निरीक्षण के लिए समस्या को लॉग इन करूंगा।

22

आपके द्वारा लिंक किए गए ब्लॉग में उदाहरण कोड केवल उदाहरण डेटा के साथ डेटाबेस को पॉप्युलेट करने के लिए सिंक-ओवर-एसिंक का उपयोग कर रहा था; वह कॉल एक उत्पादन ऐप में मौजूद नहीं होगा।

सबसे पहले, मैं कहूंगा कि यदि आपको वास्तव में Configure असीमित होने की आवश्यकता है, तो आपको एएसपी.नेट टीम के साथ कोई समस्या उठानी चाहिए ताकि यह उनके रडार पर हो। इस बिंदु पर ConfigureAsync के लिए समर्थन जोड़ने के लिए उनके लिए बहुत मुश्किल नहीं होगा (यानी, रिलीज से पहले)।

दूसरा, आपको समस्या के कुछ दृष्टिकोण मिल गए हैं। आप task.Wait (या बेहतर अभी तक, task.GetAwaiter().GetResult() का उपयोग कर सकते हैं, जो AggregateException रैपर से बचाता है यदि कोई त्रुटि होती है)। या, आप कार्य को परिणाम कार्य के बजाय कैश कर सकते हैं (जो IMemoryCache कुछ अजीब धारावाहिक-इन-बाइनरी-सरणी-इन-मेमोरी चीज़ की तुलना में एक शब्दकोश का अधिक है - मैं आपको देख रहा हूं , एएसपी.नेट के पिछले संस्करण)।

यदि यह स्वीकार्य अभ्यास माना जाता है, तो क्या - यदि कोई है - मुझे त्रुटि प्रबंधन की आवश्यकता है?

GetAwaiter().GetResult() का उपयोग अपवाद (यदि हो तो) Configure से बाहर प्रचार करने के लिए कारण होगा। मुझे यकीन नहीं है कि एएसपी.NET जवाब देगा अगर कॉन्फ़िगर करना अनुप्रयोग विफल रहा, हालांकि।

मैंने एसिंक ऑपरेशन को रद्द करने के लिए कोई तंत्र प्रदान नहीं किया है।

मुझे यकीन है कि आप कैसे "अभी नहीं" एक आवेदन की स्थापना कर सकते हैं नहीं कर रहा हूँ, इसलिए मैं इसके बारे में वह हिस्सा के बारे में चिंता नहीं होगी।

+5

आपके पहले बिंदु के बारे में, पिछले कुछ वर्षों में एएसपी.नेट टीम के साथ उठाए गए कई मुद्दे हैं। वर्तमान अवतार [अंक # 1088] (https://github.com/aspnet/Hosting/issues/1088) लगता है और इसे v3.0 से जल्द से जल्द नहीं उठाया जाएगा, जो कि [ रोडमैप] (https://github.com/aspnet/Home/wiki/Roadmap) अभी तक, 2018 में कुछ समय से जल्द नहीं है। – Stijn

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