सबसे तेज सीखने के लिए ।।
विधि निष्पादन प्रवाह (एक आरेख के साथ) को समझें: 3 मिनट
प्रश्न आत्मनिरीक्षण (सीखने के लिए): 1 मिनट
जल्दी से वाक्य रचना चीनी के माध्यम से प्राप्त करें: 5 मिनट
एक डेवलपर का भ्रम साझा करें: 5 मिनट
समस्या: सामान्य कोड के वास्तविक विश्व कार्यान्वयन को जल्दी से बदलकर Async कोड: 2 मिनट
जहाँ से अगला?
विधि निष्पादन प्रवाह (एक आरेख के साथ) को समझें: 3 मिनट
इस छवि में, # 6 पर ध्यान केंद्रित करें (इससे ज्यादा कुछ नहीं)
# 6 कदम पर: निष्पादन यहां रुक गया क्योंकि यह काम से बाहर चला गया है। इसे जारी रखने के लिए getStringTask (एक फ़ंक्शन का प्रकार) से परिणाम की आवश्यकता है। इसलिए, यह await
अपनी प्रगति को निलंबित करने के लिए और कॉल करने वाले को वापस (उपज) देने के लिए एक ऑपरेटर का उपयोग करता है (इस पद्धति का हम जिस में हैं)। GetStringTask पर वास्तविक कॉल पहले # 2 में की गई थी। # 2 पर एक स्ट्रिंग परिणाम वापस करने का वादा किया गया था। लेकिन इसका परिणाम कब लौटेगा? क्या हमें (# 1: AccessTheWebAsync) दोबारा कॉल करना चाहिए? परिणाम किसे मिलता है, # 2 (कॉलिंग स्टेटमेंट) या # 6 (स्टेटमेंट का इंतजार)
AccessTheWebAsync () का बाहरी कॉलर भी अब इंतजार कर रहा है। तो AccessTheWebAsync, और AccessTheWebAsync की प्रतीक्षा कर रहा कॉलर फिलहाल GetStringAsync की प्रतीक्षा कर रहा है। दिलचस्प बात यह है कि AccessTheWebAsync ने प्रतीक्षा करने से समय बचाने के लिए प्रतीक्षा करने से पहले (# 4) कुछ काम किया। मल्टीटास्क के लिए समान स्वतंत्रता बाहरी कॉलर (और श्रृंखला में सभी कॉलर्स) के लिए भी उपलब्ध है और यह इस 'async' चीज़ का सबसे बड़ा प्लस है! आपको ऐसा लगता है कि यह सिंक्रोनस है..या सामान्य है लेकिन ऐसा नहीं है।
याद रखें, विधि पहले ही (# 2) वापस आ गई थी, यह फिर से नहीं लौट सकती है (दूसरी बार नहीं)। तो फोन करने वाले को कैसे पता चलेगा? यह सभी कार्य के बारे में है ! टास्क पास किया गया। टास्क का इंतजार किया गया (विधि नहीं, मूल्य नहीं)। मान टास्क में सेट किया जाएगा। कार्य स्थिति को पूरा करने के लिए सेट किया जाएगा। कॉलर सिर्फ टास्क (# 6) पर नजर रखता है। तो 6 # का जवाब है जहां / जो परिणाम प्राप्त करता है। आगे के लिए यहाँ पढ़ता हूँ ।
सीखने की खातिर सवाल आत्मनिरीक्षण: 1 मिनट
आइए हम प्रश्न को थोड़ा समायोजित करें:
कैसे और कब उपयोग करें और ? async
await
Tasks
क्योंकि सीखने को Task
स्वचालित रूप से अन्य दो शामिल हैं (और आपके प्रश्न का उत्तर देते हैं)
जल्दी से वाक्य रचना चीनी के माध्यम से प्राप्त करें: 5 मिनट
रूपांतरण से पहले (मूल विधि)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
उपरोक्त विधि को कॉल करने के लिए एक कार्य-ified विधि
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
क्या हमने प्रतीक्षा या एसिंक्स का उल्लेख किया है? नहीं। उपरोक्त विधि को कॉल करें और आपको एक कार्य मिलता है जिसे आप मॉनिटर कर सकते हैं। आप पहले से ही जानते हैं कि कार्य क्या देता है .. एक पूर्णांक।
टास्क को कॉल करना थोड़ा मुश्किल है और यह तब होता है जब कीवर्ड दिखाई देने लगते हैं। हमें MethodTask कहते हैं ()
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
नीचे दिए गए चित्र के रूप में समान कोड जोड़ा गया है:
- हम कार्य समाप्त होने की प्रतीक्षा कर रहे हैं। इसलिए
await
- चूंकि हम प्रतीक्षा का उपयोग करते हैं, हमें
async
(अनिवार्य वाक्यविन्यास) का उपयोग करना चाहिए
- MethodAsync
Async
उपसर्ग के रूप में (कोडिंग मानक)
await
समझना आसान है लेकिन शेष दो ( async
, Async
) नहीं हो सकते हैं :)। हालांकि, इसे कंपाइलर के लिए बहुत अधिक अर्थ देना चाहिए। हालांकि बाद में यहां पढ़ा जाता है
तो 2 भाग हैं।
- 'कार्य' बनाएँ
- कार्य को कॉल करने के लिए सिंटैक्टिक चीनी बनाएं (
await+async
)
याद रखें, हमारे पास AccessTheWebAsync () के लिए एक बाहरी कॉलर था और उस कॉलर को या तो नहीं बख्शा गया है ... यानी इसे await+async
भी उसी की आवश्यकता है। और सिलसिला जारी है। लेकिन हमेशा Task
एक छोर पर रहेगा ।
सब ठीक है, लेकिन एक डेवलपर को # 1 (टास्क) गायब देखकर आश्चर्य हुआ ...
एक डेवलपर का भ्रम साझा करें: 5 मिनट
एक डेवलपर ने लागू नहीं करने की गलती की है Task
लेकिन यह अभी भी काम करता है! प्रश्न और बस प्रदान किए गए उत्तर को समझने की कोशिश करें । आशा है कि आप पढ़ चुके होंगे और पूरी तरह से समझ गए होंगे। सारांश यह है कि हम 'टास्क' को देख / कार्यान्वित नहीं कर सकते हैं, लेकिन इसे कहीं न कहीं मूल वर्ग में लागू किया जाता है। इसी तरह हमारे उदाहरण में पहले से ही कॉल किया गया MethodAsync()
तरीका उस तरीके को लागू करने की तुलना में आसान है जो हमारे Task
( ए MethodTask()
) के साथ है । अधिकांश डेवलपर्स Tasks
को असिंक्रोनस कोड को कोड कन्वर्ट करते समय अपना सिर इधर-उधर करना मुश्किल होता है ।
सुझाव: कठिनाई को आउटसोर्स करने के लिए एक मौजूदा Async कार्यान्वयन (जैसे MethodAsync
या ToListAsync
) खोजने का प्रयास करें । इसलिए हमें केवल Async और प्रतीक्षा से निपटने की आवश्यकता है (जो कि सामान्य कोड के समान आसान और सुंदर है)
समस्या: सामान्य कोड के वास्तविक विश्व कार्यान्वयन को जल्दी से बदलकर Async ऑपरेशन: 2 मिनट
डेटा लेयर में नीचे दिखाई गई कोड लाइन (कई जगह) टूटने लगी। क्योंकि हमने अपने कुछ कोड .Net फ्रेमवर्क 4.2 से * .Net कोर में अपडेट कर दिए हैं। हम सभी को आवेदन में 1 घंटे में इसे ठीक करना था!
var myContract = query.Where(c => c.ContractID == _contractID).First();
बहुत आसान!
- हमने EntityFramework नगेट पैकेज स्थापित किया क्योंकि इसमें QueryableExtensions है। या दूसरे शब्दों में यह Async कार्यान्वयन (कार्य) करता है, इसलिए हम सरल
Async
और await
कोड में जीवित रह सकते हैं ।
- नाम स्थान = Microsoft.EntityFrameworkCore
कॉलिंग कोड लाइन इस तरह बदल गई
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
विधि हस्ताक्षर से परिवर्तित
Contract GetContract(int contractnumber)
सेवा
async Task<Contract> GetContractAsync(int contractnumber)
कॉलिंग विधि भी प्रभावित हुई: GetContractAsync(123456);
इसे कहा गयाGetContractAsync(123456).Result;
हमने 30 मिनट में इसे हर जगह बदल दिया!
लेकिन आर्किटेक्ट ने हमें बताया कि इसके लिए सिर्फ EntityFramework पुस्तकालय का उपयोग न करें! उफ़! नाटक! फिर हमने एक कस्टम टास्क कार्यान्वयन (yuk) किया। जो आप जानते हैं कि कैसे। फिर भी आसान! ।।स्तरीय युक ।।
जहाँ से अगला?
एक शानदार त्वरित वीडियो है जिसे हम ASP.Net कोर में एसिंक्रोनस के लिए सिंक्रोनस कॉल्स को परिवर्तित करने के बारे में देख सकते हैं , शायद यह संभव है कि इसे पढ़ने के बाद एक दिशा होगी।