2012-01-30 8 views
10

मैं डब्ल्यूसीएफ 4 चैनल बंद करने के निम्नलिखित तरीकों का उपयोग कर रहा हूं। क्या ऐसा करने का यह सही तरीका है?डब्ल्यूसीएफ 4 चैनलों को प्रभावी ढंग से बंद करने का सही तरीका

using (IService channel 
    = CustomChannelFactory<IService>.CreateConfigurationChannel()) 
{ 
    channel.Open(); 

    //do stuff 
}// channels disposes off?? 

उत्तर

8

हालांकि सख्ती से चैनल पर निर्देशित नहीं है, तो आप कर सकते हैं:

ChannelFactory<IMyService> channelFactory = null; 
try 
{ 
    channelFactory = 
     new ChannelFactory<IMyService>(); 
    channelFactory.Open(); 

    // Do work... 

    channelFactory.Close(); 
} 
catch (CommunicationException) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
} 
catch (TimeoutException) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
} 
catch (Exception) 
{ 
    if (channelFactory != null) 
    { 
     channelFactory.Abort(); 
    } 
    throw; 
} 
+0

यह प्रतिक्रिया थोड़ा सा है: यह चैनल फैक्ट्री के लिए उपयोग पैटर्न प्रदान करता है, जबकि मूल प्रश्न में चैनल शामिल होता है। हालांकि यह सच है (मेरा मानना ​​है कि कारखाने को बंद करने से सभी चैनलों को बंद कर दिया जाएगा, एक चैनल को रखने के लिए एक और आम पैटर्न है कारखाना खोलना ताकि यह कई चैनल कुशलता से बना सके। फैक्ट्री को काम के लिए खोलते समय प्रत्येक चैनल को व्यक्तिगत रूप से बंद किया जाना चाहिए। –

+0

यह सच है - इसे इंगित करने के लिए धन्यवाद। –

+0

@ ÖrjanJämte को प्रतिबिंबित करने के लिए समायोजित पोस्ट को –

17

"जल्दी" WCF के दिनों में WCF ग्राहक प्रॉक्सी जारी करने के लिए आमतौर पर स्वीकार किया जिस तरह से हुआ करता था कि।

हालांकि चीजें बदल गई हैं। यह पता चला कि IClientChannel<T>.Dispose() का कार्यान्वयन केवल IClientChannel<T>.Close() विधि को आमंत्रित करता है, जो कुछ परिस्थितियों में अपवाद फेंक सकता है, जैसे अंतर्निहित चैनल खुला नहीं है या समय पर फैशन में बंद नहीं किया जा सकता है।

इसलिए Close() को catch ब्लॉक के भीतर डालने का अच्छा विचार नहीं है क्योंकि अपवाद के मामले में कुछ अप्रकाशित संसाधनों के पीछे छोड़ सकते हैं।

नई तरह से सिफारिश की बजाय catch ब्लॉक के भीतर IClientChannel<T>.Abort() आह्वान करने के लिए, मामला Close() में विफल हो जाएगा है। यहाँ एक उदाहरण है:

try 
{ 
    channel.DoSomething(); 
    channel.Close(); 
} 
catch 
{ 
    channel.Abort(); 
    throw; 
} 

अद्यतन:

यहाँ एक MSDN लेख कि describes this recommendation के लिए एक संदर्भ है।

+0

अपडेट किया गया है क्या मुझे वास्तव में चैनल बंद करना है? मैं इसे खोलने के लिए सोच रहा हूं और अगली बार जब मैं इसका इस्तेमाल करता हूं तो मैं कारखाने की जांच करता हूं। स्टेटस! = कम्युनिकेशनस्टेट। ओपन (मेरे मामले में पाइप फैक्ट्री) और यदि सच है तो चैनल को दोबारा बनाना। – Valentin

+1

@ वेलेंटीन संक्षिप्त उत्तर ** हाँ ** है, आपको * एक डब्ल्यूसीएफ चैनल * स्पष्ट रूप से * जारी करना चाहिए * जब इसकी आवश्यकता नहीं है। एक खुले डब्ल्यूसीएफ चैनल में कुछ निचले स्तर के रिसोर होते हैं, जैसे टीसीपी सॉकेट या HTTP कनेक्शन। यदि आप इन संसाधनों को रिहाई कलेक्टर के * नोडेटर्मिनिस्टिक * हाथों में छोड़कर देरी में देरी करते हैं, तो आप ऐसी परिस्थिति में भाग ले सकते हैं जहां वे दुर्लभ हो जाते हैं, जिससे नए चैनल बनाना असंभव हो जाता है। –

+0

क्या आपके पास दस्तावेज़ों का कोई संदर्भ है जो अनुशंसा के इस परिवर्तन का वर्णन करते हैं? – Macke

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