2017-12-22 103 views
5

मेरे पास एक वेब सर्वर है और एक आवधिक नौकरी विलय हो जाती है और रिकॉर्ड भेजती है (अनुरोध लॉग के बहुत सारे)।कीवर्ड की प्रतीक्षा किए बिना कॉल एसिंक विधि क्या होती है?

Task.Run(() => 
{ 
    while (true) 
    { 
     try 
     { 
      MergeAndPutRecords(); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error(ex); 
     } 
    } 
}); 

MergeAndPutRecords समारोह में, कोड विलय रिकॉर्ड देखते हैं और async फ़ंक्शन टास्क रिकॉर्ड भेजने के। (Actaully यह अमेज़ॅन Kinesis Firehose PutRecordBatchAsync है।)

तब क्या होता है यदि मैं बिना किसी कीवर्ड के उस फ़ंक्शन को कॉल करता हूं? क्या कार्य अलग थ्रेड पर चलता है? Here says it is not। फिर कार्य साधन वापस क्या कर रहा है? Here का इंतजार कीवर्ड बिना async विधि का मतलब है

  1. शुरू होता है वर्तमान धागे पर अतुल्यकालिक विधि कहते हैं। सभी परिणामों को अनदेखा करता है (अपवाद सहित)।

तब मेरे समय-समय पर काम और PutRecordBatchAsync समवर्ती कार्रवाई की जाती है? मुझे एसिंक्रोनहाउस पता है और समवर्ती अलग है। लेकिन कोई प्रतीक्षा कीवर्ड नहीं है और वे एक ही धागे में हैं। पहले कौन सा निष्पादित किया जाएगा? मैं उलझन में हूं ...

बड़े रिकॉर्ड होंगे जिन्हें वास्तविक समय में विलय और भेजा जाना चाहिए। तो मुझे लगता है कि इसे समवर्ती रूप से निष्पादित किया जाना चाहिए ..

+3

'async' कीवर्ड अपने आप में कुछ नहीं करता में अवरुद्ध है। प्रत्येक 'प्रतीक्षा' को 'AsyncStateMachine' में जोड़ा जाता है जो अतुल्यकालिक रूप से सामग्री को संसाधित कर सकता है। आप 'async' विधि के अंदर' await' कीवर्ड नहीं है, तो फिर वहाँ 'AsyncStateMachine' बनाने के लिए कोई कारण नहीं है, तो आप तुल्यकालिक विधि मिलता है। – FCin

+3

'प्रतीक्षा' का उपयोग * आने के परिणाम के लिए प्रतीक्षा * है। यह किसी भी तरह से, नियंत्रण * परिणाम प्राप्त करने की प्रक्रिया ** शुरू नहीं हुई थी *** या परिणाम प्राप्त करने की चल रही प्रक्रिया कैसे काम कर रही है। –

उत्तर

5

फिर मेरी आवधिक नौकरी और PutRecordBatchAsync समवर्ती रूप से संसाधित की जाती है?

टास्क API का उपयोग करके आप सुनिश्चित कर सकते हैं कि वे समवर्ती क्रियान्वित कर रहे हैं (थ्रेड पूल का प्रयोग करके), लेकिन आप बनाम आईओ आधारित संगामिति स्मृति में समवर्ती आपरेशनों के बीच अंतर को समझना होगा।

जबकि मेमोरी कॉन्सुरेंसी में कार्य का उपयोग करके लाभ होता है, आईओ कॉल को एक बार निष्पादित करने की आवश्यकता नहीं होती है, क्योंकि यह हार्डवेयर समेकन पर निर्भर करता है, अगर यह कभी भी थ्रेड का उपयोग करता है, तो यह सब आईओ कॉल के लिए इंतजार करेगा वापस जाने के लिए, इस प्रकार कीमती सिस्टम संसाधन बर्बाद कर और प्रणाली scalability

को कम करने

आप मामले कि आईओ आधारित संगामिति, जैसा कि आप एक दूरस्थ/नेटवर्क आधारित एपीआई कहते हैं, कैसे async-इंतजार यहाँ मदद करता है?

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

क्या होगा यदि आप async के साथ प्रतीक्षा नहीं करते हैं?

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

में स्मृति के लिए सामान्य तौर पर प्रसंस्करण आप कार्य की निश्चित संख्या में बना सकते हैं और एक संग्रह के लिए Task.WaitAll या Parallel.ForEach उपयोग करके उन्हें प्रोसेस होता है, Async प्रसंस्करण के लिए, आदर्श सिफारिश नहीं, कहीं भी एक Task.Run है अपने Async से करने के लिए पसंद करते हैं प्रवेश बिंदु, एमवीसी के मामले में इसकी तरह संभव है, नियंत्रक async हो सकता है। एकाधिक कॉल Task.WhenAll प्रतिनिधि कार्य का उपयोग कर एक साथ समूहीकृत किए जाते हैं और फिर प्रतीक्षा करते हैं। भले ही आप अपने कोड में के रूप में Task.Run उपयोग करते हैं, तो async lambda का उपयोग एक अतुल्यकालिक कॉल निष्पादित करने के लिए

सारांश:

इसके अतुल्यकालिक कॉल के लिए await उपयोग करने के लिए, और वे async कीवर्ड उस संदर्भ में बेकार है अनिवार्य और हाँ await, आईओ कॉल के लिए इंतजार करेंगे पहले निरंतरता निष्पादित किया जाता है वापस जाने के लिए ही कोई धागा प्रक्रिया

0

यदि कोई विधि Task देता है, तो किसी भी समय Task के परिणाम का निरीक्षण करना हमेशा सर्वोत्तम अभ्यास होता है। यह घोषित वापसी मूल्य हो सकता है, या यह एक अपवाद हो सकता है। यदि आप अपनी विधि जारी रखने से पहले उस कार्य को देखना चाहते हैं, तो await अनुशंसा है।

इस मामले में, आपको शायद का परिणाम PutRecordBatchAsync पर वापस देखना चाहिए। आप जानना चाहेंगे कि कॉल किसी भी कारण से विफल रही है क्योंकि यह शायद इंगित करता है कि आपके रिकॉर्ड संग्रहीत नहीं किए गए थे!

आपके द्वारा दिए गए उदाहरण कोड में, आप पाएंगे कि पिछली कॉल पूर्ण होने से पहले आप MergeAndPutRecords पर अगली कॉल कर सकते हैं। क्या आप वाकई इसका इरादा रखते हैं?

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