2011-08-25 12 views
7

मैंने सुना है कि यह निपटान के लिए आवश्यक (या बंद) एक WCF ग्राहक प्रॉक्सी भी जबक्यों यह महत्वपूर्ण निपटान/एक WCF ग्राहक प्रॉक्सी

  • आप सत्र
  • नहीं देखते हैं उपयोग नहीं कर रहे है बंद करने के लिए है अप्रबंधित संसाधन है कि नियतात्मक (जैसे खुले सॉकेट) को साफ की जरूरत

उदाहरण के लिए, जब डिफ़ॉल्ट बाइंडिंग विन्यास के साथ एक BasicHttpBinding का उपयोग कर, यह ठीक एक लोकप्रिय वेब पेज में भी, सही होना चाहिए?

var clt = new MyServiceClient(); 
clt.PlaceOrder(foo); 
// no dispose 

या

var clt = new ChannelFactory<IOrderService>().CreateChannel(); 
clt.PlaceOrder(foo); 

धन्यवाद

+9

मैं तुम्हें _could_ जीसी यह तुम्हारे लिए क्या है, लेकिन यह सिर्फ साफ नहीं कोड है जाने लगता है। आप इसे घोषित करते हैं, आप इसे मुक्त करते हैं। मूल बातें जो अब सिखाई नहीं लगती हैं। –

उत्तर

3

एक चैनल फैक्टरी & बनाना इसे खोलना एक महंगा ऑपरेशन है और यदि आप प्रदर्शन की देखभाल करते हैं तो आपको प्रत्येक कॉल के लिए ऐसा करने से बचना चाहिए।

आपका पहला उपयोगकेस मूल Http बाइंडिंग के साथ भी सही नहीं है क्योंकि यह संभावित रूप से प्रत्येक तत्कालता के लिए एक नया चैनलेटरी बना देगा। .NET 3.5 SP1 ने कुछ चैनलफैक्टरी कैशिंग पेश की है ताकि आप कुछ परिदृश्यों में ठीक हो सकें।

अपने दूसरे उपयोगकेस में, यदि आप चैनफ्रैक्टरी को कैश और पुन: उपयोग करते हैं, तो निपटान वास्तव में नस्लीय नहीं है लेकिन ध्यान रखें कि आप/आपके परिनियोजन लड़के बाध्यकारी @ तैनाती के समय को बदल सकते हैं और बंद/निपटान की कमी का असर हो सकता है ।

संक्षेप में यह हमेशा बंद/निपटान करने के लिए सुरक्षित रहता है और यही कारण है कि एमएसडीएन सुझाव देता है।

15

इसका अच्छा अभ्यास बातें बंद करने के लिए (और उनमें से निपटाने) जब आप उन लोगों के साथ काम हो गया। (क्या आप एक फ़ाइल स्ट्रीम खोल सकते हैं भले ही आप इसे पढ़ने/लिखने के माध्यम से हों?) ऑफ-हाथ, मैं कुछ कारण देख सकता हूं:

  1. सर्वर (कर/कर सकता है) सीमित है सक्रिय कनेक्शन की संख्या यह बरकरार रखती है। जितनी जल्दी आप अपनी सेवा का निपटान करेंगे, जल्द ही अगले ग्राहक के पास उस स्लॉट का उपयोग करने की उपलब्धता होगी। (यदि आप वास्तव में हैं तो टाइमआउट की प्रतीक्षा क्यों करें?)
  2. किसी निष्क्रिय कनेक्शन के अतिरिक्त ओवरहेड से बचें। अनुमोदित संसाधन इन दिनों "भरपूर" हैं, लेकिन अंत में जितना कम ओवरहेड बेहतर होगा उतना ही आपका प्रदर्शन बेहतर होगा।
  3. क्लाइंट को निपटाने के दौरान समय-समय पर त्रुटियों के कारण त्रुटियों/अपवादों का जोखिम कम हो जाता है।
  4. जब आप अपने माध्यम से होते हैं तो इसे बंद करके सर्वर लॉग को प्रभावी ढंग से नियंत्रित कर रहे हैं। अंत में, यहां तक ​​कि यदि क्लाइंट इसे नहीं दिखाता है, तो सर्वर एक निष्क्रिय कनेक्शन के कारण लॉग में दिखाए गए टाइमआउट अपवादों के साथ समाप्त हो सकता है, जिनकी देखभाल नहीं की जानी चाहिए।
  5. MSDN says to (डब्ल्यूसीएफ क्लाइंट ऑब्जेक्ट्स सूची में चौथी गोली नोट करें)।

कुछ कारणों से मैं अपने सिर के ऊपर से सोच सकता हूं।

+0

* बंद * कनेक्शन एक कनेक्शन के * निपटान * जैसा नहीं है। –

+3

@ किर्क: सहमत है, लेकिन यह भी सुनिश्चित करने के लिए जांचें कि कोई त्रुटि मौजूद नहीं है, अन्यथा एक अपरोर्ट किया जाना चाहिए। –

+0

कुछ नोट्स - फाइल सिस्टम अप्रबंधित संसाधनों का प्रतिनिधित्व करता है। प्रश्न में प्रॉक्सी नहीं है। प्रश्न वास्तव में 'क्यों' है और क्योंकि यह साफ है या क्योंकि एमएसडीएन कहता है कि ऐसा नहीं है जिसे मैं ढूंढ रहा था। क्या आप कह रहे हैं कि निपटान एक खुला कनेक्शन बंद करता है (यहां तक ​​कि basicHttp बाइंडिंग के लिए भी) और यही कारण है कि आपको यह करना चाहिए? धन्यवाद – ConfusedNoob

2

यह वास्तव में ग्राहक के प्रकार पर निर्भर करता है। उदाहरण के लिए, यदि आप एक एएसपी.NET एप्लिकेशन लिखते हैं जो सेवा में कॉल करता है, तो प्रॉक्सी को कैश करना एक अच्छा विचार है क्योंकि इसकी रचना महंगी है।

यह कहा जा रहा है कि, एक बार जब आप किसी भी आईडीस्पोज़ेबल संसाधन के साथ काम कर लेंगे, तो आपको इसका निपटान करना चाहिए ताकि ऑब्जेक्ट का निपटारा करने वाले ऑब्जेक्ट को संसाधनों को रिलीज़ करने का मौका मिले जिससे इसे स्मृति से हटाया जा सके। यदि एक आईडीस्पोजेबल ऑब्जेक्ट में बंद विधि है, तो इसे पहले कहा जाना चाहिए। इस आकर्षक विषय पर

एक उत्कृष्ट लेख यहां पाया जा सकता: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

संबंधित मुद्दे