मुझे एस # एस async
/ await
कीवर्ड (मैं सी # 5.0 पर नया हूं) का उपयोग करके अतुल्यकालिक प्रोग्रामिंग के लिए कुछ सर्वोत्तम प्रथाओं में आया हूं ।
दी गई एक सलाह निम्नलिखित थी:
स्थिरता: अपने सिंक्रनाइज़ेशन संदर्भों को जानें
... कुछ सिंक्रनाइज़ेशन संदर्भ नॉन-रीएंन्ट्रेंट और सिंगल-थ्रेडेड हैं। इसका अर्थ है कि किसी निश्चित समय में केवल एक इकाई कार्य को निष्पादित किया जा सकता है। इसका एक उदाहरण Windows UI थ्रेड या ASP.NET अनुरोध संदर्भ है। इन एकल-थ्रेडेड सिंक्रनाइज़ेशन संदर्भों में, अपने आप को गतिरोध करना आसान है। यदि आप किसी कार्य को एकल-थ्रेडेड संदर्भ से अलग करते हैं, तो संदर्भ में उस कार्य की प्रतीक्षा करें, आपका प्रतीक्षा कोड पृष्ठभूमि कार्य को अवरुद्ध कर सकता है।
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
अगर मैं इसे खुद से अलग करने की कोशिश करता हूं, तो मुख्य धागा एक नए में पैदा होता है MyWebService.GetDataAsync();
, लेकिन चूंकि मुख्य धागा वहां इंतजार करता है, इसलिए यह परिणाम पर इंतजार करता है GetDataAsync().Result
। इस बीच, यह कहें कि डेटा तैयार है। मुख्य सूत्र क्यों जारी नहीं रखता है यह निरंतरता तर्क है और इससे एक स्ट्रिंग परिणाम देता है GetDataAsync()
?
क्या कोई मुझे समझा सकता है कि उपरोक्त उदाहरण में गतिरोध क्यों है? मुझे पूरी तरह पता है कि समस्या क्या है ...