बयानों का उपयोग करें और प्रतीक्षा करें कि सी # में अच्छी तरह से कीवर्ड खेलें


101

मेरे पास एक ऐसी स्थिति है जहां मैं एक ऐसी asyncविधि के लिए एक कॉल कर रहा हूं जो रिटर्न और IDisposableउदाहरण देता है । उदाहरण के लिए:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

अब पहले asyncदृश्य पर था, जब एक IDisposableउदाहरण के साथ काम कर रहा था , यह कॉल और कोड जिसने "प्रतिक्रिया" चर का उपयोग किया था, एक उपयोग कथन में लपेटा जाएगा।

मेरा सवाल यह है कि जब asyncकीवर्ड में कीवर्ड डाला जाता है तो क्या वह सही तरीका है? कोड संकलित होने के बावजूद, क्या नीचे दिए गए उदाहरणों में अपेक्षित कथन अभी भी काम करेगा?

उदाहरण 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

उदाहरण 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}

जवाबों:


97

हां, यह ठीक होना चाहिए।

पहले मामले में, आप वास्तव में कह रहे हैं:

  • अतुल्यकालिक रूप से प्रतीक्षा करें जब तक हम प्रतिक्रिया प्राप्त नहीं कर सकते
  • इसका उपयोग करें और तुरंत इसका निपटान करें

दूसरे मामले में, आप कह रहे हैं:

  • अतुल्यकालिक रूप से प्रतीक्षा करें जब तक हम प्रतिक्रिया प्राप्त नहीं कर सकते
  • जब तक हम प्रतिक्रिया को लॉग इन नहीं करते हैं, तब तक असंगत रूप से प्रतीक्षा करें
  • प्रतिक्रिया का निपटान

एक usingasync विधि में एक कथन "विषम" है जिसमें Disposeकॉल एक अलग थ्रेड में निष्पादित हो सकता है जिसने संसाधन का अधिग्रहण किया है (सिंक्रनाइज़ेशन संदर्भ आदि के आधार पर) लेकिन यह अभी भी होगा ... उस चीज़ को मान लेना जिसे आप इंतजार कर रहे हैं कभी नहीं दिखाता है या विफल रहता है। (जैसे आप Disposeअपने usingबयान में गैर-एस्किंक कोड में कॉलिंग समाप्त नहीं करेंगे, यदि आपके बयान में ऐसी विधि के लिए कॉल शामिल है जो कभी वापस नहीं आती है।)


4
धन्यवाद जॉन। हालांकि अधिकांश एसिंक्स सामान अभी भी मेरे लिए वूडू है, यह देखने के लिए काफी आश्वस्त है कि यह कितनी बार अन्य .net सुविधाओं के साथ एकीकृत होता है और सिर्फ काम करता है
स्वैन्डोइक्टर

@JonSkeet का इंतजार एक using(){...}ब्लॉक के अंदर भी किया जाना चाहिए या यह एक ओवरकिल है या कुछ मामलों में प्रदर्शन को कम कर सकता है? के using(){...}रूप में एक ही उद्देश्य की सेवा करता है await?
नाम

1
@ नहीं: नहीं, using और awaitपूरी तरह से अलग उद्देश्यों की सेवा। ध्यान दें कि C # 8 में अब अतुल्यकालिक निपटान भी है। हालांकि यह मेरे जवाब पर प्रकाश डाला गया है, लेकिन निश्चित रूप से इसका मतलब यह नहीं है कि यह मिश्रण और गलत है । usingawait
जॉन स्कीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.