मुझे पार्टी के लिए देर हो रही है, लेकिन यहाँ इस मुश्किल विषय पर मेरी सीखने की यात्रा है।
1. हम HttpClient का पुन: उपयोग करने पर आधिकारिक अधिवक्ता कहां मिल सकते हैं?
मेरा मतलब है, अगर HttpClient का पुन: उपयोग करना उद्देश्य है
और ऐसा करना महत्वपूर्ण है , तो ऐसे एडवोकेट को "उन्नत विषयों", "प्रदर्शन (विरोधी) पैटर्न" या अन्य ब्लॉग पोस्ट के बहुत सारे में छिपे होने के बजाय अपने स्वयं के एपीआई प्रलेखन में बेहतर दस्तावेज दिया जाता है। । अन्यथा किसी नए शिक्षार्थी को बहुत देर होने से पहले इसे कैसे जानना चाहिए?
अब (मई 2018) के अनुसार, "सी # httpclient" को googling करते हुए पहला खोज परिणाम MSDN पर इस API संदर्भ पृष्ठ की ओर इंगित करता है, जिसमें उस इरादे का उल्लेख बिल्कुल नहीं है। खैर, नौसिखिया के लिए सबक 1 यहाँ है, हमेशा MSDN मदद पृष्ठ शीर्षक के बाद "अन्य संस्करण" लिंक पर क्लिक करें, आपको संभवतः "वर्तमान संस्करण" के लिंक मिलेंगे। इस HttpClient मामले में, यह आपको नवीनतम दस्तावेज़ यहाँ लाएगा,
जिसमें वह इरादा विवरण होगा ।
मुझे कई डेवलपर्स पर शक है जो इस विषय पर नए थे, उन्हें सही प्रलेखन पृष्ठ भी नहीं मिला, इसीलिए यह ज्ञान व्यापक रूप से फैला नहीं है, और लोग आश्चर्यचकित थे जब उन्हें बाद में पता
चला , संभवतः एक कठिन तरीके से ।
2. (गलत?) का गर्भाधान using
IDisposable
यह एक थोड़ा विषय से हटकर, लेकिन अभी भी उनका कहना है कि, यह आरोप लगा है कि उन aforementioned ब्लॉग पोस्ट में लोगों को देखने के एक संयोग नहीं है लायक है HttpClient
के IDisposable
इंटरफेस उन्हें इस्तेमाल करते हैं using (var client = new HttpClient()) {...}
पैटर्न और फिर समस्या पैदा।
मेरा मानना है कि एक अनिर्दिष्ट (गलत?) गर्भाधान के लिए नीचे आता है:
"एक आईडीसोफोबिक ऑब्जेक्ट के अल्पकालिक होने की उम्मीद है" ।
जब हम इस शैली में कोड लिखते हैं तो यह निश्चित रूप से एक अल्पकालिक चीज की तरह दिखता है:
using (var foo = new SomeDisposableObject())
{
...
}
IDisposable पर आधिकारिक दस्तावेज
कभी नहीं उल्लेख IDisposable
वस्तुओं अल्पकालिक रहना होगा। परिभाषा के अनुसार, आईडीसॉरोप्लेट केवल एक तंत्र है जो आपको अप्रबंधित संसाधनों को जारी करने की अनुमति देता है। और कुछ नहीं। उस अर्थ में, आप अंततः निपटान को ट्रिगर करने के लिए तैयार हैं, लेकिन यह आपको अल्पकालिक फैशन में ऐसा करने की आवश्यकता नहीं है।
इसलिए यह आपकी नौकरी है कि जब आपकी वास्तविक वस्तु के जीवन चक्र की आवश्यकता के आधार पर निपटान को ट्रिगर करने के लिए ठीक से चुनना है। लंबे समय तक जीवित रहने के तरीके में आपको आईडीसॉपी का उपयोग करने से कोई रोक नहीं सकता है:
using System;
namespace HelloWorld
{
class Hello
{
static void Main()
{
Console.WriteLine("Hello World!");
using (var client = new HttpClient())
{
for (...) { ... } // A really long loop
// Or you may even somehow start a daemon here
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
इस नई समझ के साथ, अब हम उस ब्लॉग पोस्ट पर फिर से गौर करते हैं , हम स्पष्ट रूप से देख सकते हैं कि "फिक्स" HttpClient
एक बार इनिशियलाइज़ हो जाता है, लेकिन इसे कभी भी डिस्पोज़ नहीं किया जाता है, यही कारण है कि हम इसके नेटस्टैट आउटपुट से देख सकते हैं, यह कनेक्शन एस्टेब्लिशड स्टेट पर रहता है, अर्थात इसका अर्थ है ठीक से बंद नहीं किया गया। यदि इसे बंद किया गया, तो इसके स्थान पर TIME_WAIT होगा। व्यवहार में, आपके पूरे कार्यक्रम के समाप्त होने के बाद केवल एक कनेक्शन को खोलना कोई बड़ी बात नहीं है, और ब्लॉग पोस्टर में अभी भी फिक्स होने के बाद प्रदर्शन देखने को मिलता है; लेकिन फिर भी, यह आईडीसोपायरी को दोष देने के लिए वैचारिक रूप से गलत है और इसे निपटाने के लिए नहीं।
3. क्या हमें HttpClient को एक स्थिर संपत्ति में रखना है, या एक सिंगलटन के रूप में भी डालना है?
पिछले अनुभाग की समझ के आधार पर, मुझे लगता है कि यहां उत्तर स्पष्ट हो गया है: "जरूरी नहीं"। यह वास्तव में इस बात पर निर्भर करता है कि आप अपने कोड को कैसे व्यवस्थित करते हैं, जब तक कि आप एक HttpClient का पुन: उपयोग नहीं करते हैं (आदर्श रूप से) इसे अंततः निपटाने।
प्रफुल्लित करने वाला, वर्तमान आधिकारिक दस्तावेज़ के रिमार्क्स अनुभाग में उदाहरण भी नहीं है,
यह कड़ाई से सही है। यह एक "गुडकंट्रोलर" वर्ग को परिभाषित करता है, जिसमें स्थिर HttpClient गुण होता है जिसे निपटाया नहीं जाएगा; उदाहरण खंड में एक और उदाहरण क्या अवहेलना करता है
: "निपटान को कॉल करने की आवश्यकता है ... इसलिए एप्लिकेशन संसाधनों को लीक नहीं करता है"।
और अंत में, सिंगलटन अपनी चुनौतियों के बिना नहीं है।
"कितने लोग सोचते हैं कि वैश्विक परिवर्तन एक अच्छा विचार है? कोई नहीं।
कितने लोग सोचते हैं कि सिंगलटन एक अच्छा विचार है? कुछ।
क्या देता है? सिंगलटन वैश्विक वैरिएबल का एक समूह हैं। "
- इस प्रेरक वार्ता से उद्धृत, "ग्लोबल स्टेट एंड सिंग्लेटन्स"
पुनश्च: SqlConnection
यह एक वर्तमान क्यू एंड ए के लिए अप्रासंगिक है, लेकिन यह शायद एक अच्छा-जानने वाला है। SqlConnection उपयोग पैटर्न अलग है। आपको SqlConnection का पुन: उपयोग करने की आवश्यकता नहीं है , क्योंकि यह इस तरह से अपने कनेक्शन पूल को बेहतर ढंग से संभाल लेगा।
अंतर उनके कार्यान्वयन दृष्टिकोण के कारण होता है। प्रत्येक HttpClient उदाहरण अपने स्वयं के कनेक्शन पूल ( यहाँ से उद्धृत ) का उपयोग करता है
; लेकिन SqlConnection अपने आप में एक केंद्रीय कनेक्शन पूल द्वारा किया जाता है, के अनुसार इस ।
और आपको अभी भी SqlConnection को निपटाना होगा, जैसा कि आपको HttpClient के लिए करना चाहिए।