System.Net.Http.HttpClient और System.Net.Http.HttpClientHandler .NET फ्रेमवर्क 4.5 में IDis प्रयोज्य को लागू करें ( System.Net.Http.Http.MessageInvoker के माध्यम से )।
using
बयान प्रलेखन का कहना है:
एक नियम के रूप में, जब आप एक आइडीएसोपॉलिज्ड ऑब्जेक्ट का उपयोग करते हैं, तो आपको एक उपयोग स्टेटमेंट में इसे घोषित और तत्काल करना चाहिए।
यह उत्तर इस पैटर्न का उपयोग करता है:
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
लेकिन Microsoft से सबसे अधिक दिखाई देने वाले उदाहरण कॉल नहीं करते हैं Dispose()
स्पष्ट रूप से या अंतर्निहित रूप से । उदाहरण के लिए:
- HttpClient के रिले की घोषणा करने मूल ब्लॉग लेख ।
- वास्तविक HttpClient के लिए MSDN प्रलेखन ।
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
में घोषणा की टिप्पणियों है, किसी से कहा कि माइक्रोसॉफ्ट कर्मचारी:
आपके नमूनों की जाँच करने के बाद, मैंने देखा कि आपने HttpClient उदाहरण पर डिस्पोज़ करने की क्रिया नहीं की। मैंने अपने ऐप पर स्टेटमेंट का उपयोग करने के साथ HttpClient के सभी उदाहरणों का उपयोग किया है और मैंने सोचा कि यह सही तरीका है क्योंकि HttpClient आईडीआईसोफ़ेक्टिव इंटरफ़ेस को लागू करता है। क्या मैं सही रास्ते पर हूँ?
उनका जवाब था:
सामान्य तौर पर यह सही है, हालांकि आपको "उपयोग" और async से सावधान रहना होगा क्योंकि वे वास्तव में '.net 4' में मिश्रण नहीं करते हैं, .Net 4.5 आप "का उपयोग कर" कथन के अंदर "इंतजार" का उपयोग कर सकते हैं।
Btw, आप एक ही HttpClient को कई बार फिर से उपयोग कर सकते हैं [जैसा कि] आपको पसंद है इसलिए आमतौर पर आप उन्हें हर समय नहीं बनाएंगे / उन्हें डिस्पोज़ नहीं करेंगे।
दूसरा पैराग्राफ इस सवाल के लिए बहुत ही अच्छा है, जो इस बात से चिंतित नहीं है कि आप कितनी बार HttpClient इंस्टेंस का उपयोग कर सकते हैं, लेकिन अगर इसके बाद आपको इसकी आवश्यकता नहीं है, तो इसे निपटाने के लिए आवश्यक है।
(अपडेट: वास्तव में दूसरा पैराग्राफ उत्तर की कुंजी है, जैसा कि @DPeden द्वारा नीचे दिया गया है।)
तो मेरे सवाल हैं:
HttpClient और HttpClientHandler उदाहरणों पर Dispose () कॉल करने के लिए क्या यह आवश्यक है कि वर्तमान कार्यान्वयन (.NET फ्रेमवर्क 4.5) दिया जाए? स्पष्टीकरण: "आवश्यक" से मेरा मतलब है कि यदि निपटान नहीं करने के लिए कोई नकारात्मक परिणाम हैं, जैसे कि संसाधन रिसाव या डेटा भ्रष्टाचार जोखिम।
यदि यह आवश्यक नहीं है, तो क्या यह वैसे भी "अच्छा अभ्यास" होगा, क्योंकि वे आईडीआईएसओपी को लागू करते हैं?
यदि यह आवश्यक (या अनुशंसित) है, तो क्या यह कोड सुरक्षित रूप से लागू करने के लिए ऊपर उल्लिखित है (.NET फ्रेमवर्क 4.5 के लिए)?
यदि इन वर्गों को डिसपोजल () कॉल करने की आवश्यकता नहीं है, तो उन्हें आईडीसोप्लिक के रूप में क्यों लागू किया गया?
यदि उन्हें आवश्यकता है, या यदि यह एक अनुशंसित अभ्यास है, तो क्या Microsoft उदाहरण भ्रामक या असुरक्षित हैं?
Flush
प्रत्येक लिखने के बाद एक पर कॉल कर सकते हैं , और इसके अलावा असुविधा के अलावा अंतर्निहित संसाधनों को अधिक से अधिक समय तक जारी रखना आवश्यक है, "सही व्यवहार" के लिए क्या आवश्यक नहीं होगा?