मैं async/await
के बारे में कुछ और समझने की कोशिश कर रहा हूं और विशेष रूप से कैसे संकलक async
विधि और await
पर अतिरिक्त थ्रेड के बिना "रोकें" को जानता है।एक सी # कंपाइलर को एसिंक विधि को काटने का तरीका कैसा लगता है?
उदाहरण के लिए, मान लीजिए कि मैं Task
एक बार की तरह
DoSomeStuff();
await sqlConnection.OpenAsync();
DoSomeOtherStuff();
मैं जानता हूँ कि await sqlConnection.OpenAsync();
जहाँ मेरे विधि "निलंबित" हो जाता है कि एक async
विधि और धागा है कि लागू यह थ्रेड पूल रिटर्न और डालते हैं जो कनेक्शन खोलने को पूरा कर रहा है, तब उपलब्ध थ्रेड DoSomeOtherStuff()
चलाने के लिए मिलता है।
| DoSomeStuff() | "start" opening connection | ------------------------------------ |
| ---------------------------------------------------------- | DoSomeOtherStuff() - |
यहां मैं उलझन में हूं। मैं OpenAsync
(https://referencesource.microsoft.com/#System.Data/System/Data/Common/DBConnection.cs,e9166ee1c5d11996,references) के स्रोत कोड को देखो और
public Task OpenAsync() {
return OpenAsync(CancellationToken.None);
}
public virtual Task OpenAsync(CancellationToken cancellationToken) {
TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();
if (cancellationToken.IsCancellationRequested) {
taskCompletionSource.SetCanceled();
}
else {
try {
Open();
taskCompletionSource.SetResult(null);
}
catch (Exception e) {
taskCompletionSource.SetException(e);
}
}
return taskCompletionSource.Task;
}
मैं कुछ जगह है जहाँ संकलक धागा "कट" करने के लिए पता होगा क्योंकि कार्य एक बाहरी संसाधन के साथ संवाद स्थापित शुरू हो गया है को देखने के लिए कल्पना है, लेकिन मुझे वास्तव में यह नहीं दिखाई देता है, और वास्तव में, Open();
का अर्थ यह है कि यह सिंक्रनाइज़ रूप से प्रतीक्षा कर रहा है। क्या कोई समझा सकता है कि यह कैसे थ्रेडलेस "सच्चे एसिंक" कोड बन जाता है?
ठीक है, OpenAsync का ऐसा कार्यान्वयन वास्तव में "सत्य async" कोड नहीं है। – CodeFuller
सी # कंपाइलर आपके कोड को फिर से लिखता है, यह एक छिपे हुए वर्ग के * दो * तरीकों में बदल जाता है। DoSomeOtherStuff() कॉल दूसरी विधि में है। आपके पास हो सकता है कि किसी भी स्थानीय चर और दोनों भागों में उपयोग किया जाता है उस वर्ग के क्षेत्र बन जाते हैं। Ildasm.exe उपयोगिता का उपयोग कर आप कुछ देख सकते हैं। –
@CodeFuller क्या आप मुझे OpenAsync() के "true async" कार्यान्वयन के उदाहरण के लिए इंगित कर सकते हैं? या दिखाएं कि उपरोक्त 'OpenAsync() 'को सच async के रूप में कैसे लिखा जा सकता है? – Questionaire