2011-01-17 9 views
6

.NET 4.0 का उपयोग करना। मेरे पास कुछ कोड है जो BeginConnect और कॉलबैक का उपयोग करके कनेक्शन खोलने का प्रयास करता है। यदि उपयोगकर्ता अगले कुछ पलों में प्रोग्रामिंग को रोकने की कोशिश करता है तो मैं डिस्कनेक्ट करने का प्रयास करता हूं। उस बिंदु पर मैंने संकेत दिया कि एंडकनेक्ट को कॉलबैक से कॉल करने की आवश्यकता है या नहीं। अगर ध्वज गलत पर सेट किया गया है तो मैं एंडकनेक्ट को छोड़ देता हूं क्योंकि सॉकेट को वैसे भी ट्रैश किया गया है।क्या होता है यदि आप कभी सॉकेट को कॉल नहीं करते हैं। एंडकनेक्ट?

इस बिंदु पर उपयोगकर्ता तुरंत फिर से कनेक्ट करने का प्रयास कर सकते हैं। मुझे यह नहीं दिख रहा है लेकिन बस मामले में। अब एक नई सॉकेट बनाई गई है और BeginConnect को फिर से बुलाया जाता है।

क्या यह कभी भी एंडकनेक्ट विधि को कॉल करना ठीक है?

उत्तर

3
सभी मामलों (सिवाय एक [1]) BeginZZZ के लिए एक कॉल की जरूरत है एक मिलान EndZZZZ में

अन्यथा गैर-प्रबंधित संसाधन लीक होने जा रहे हैं, और बहुत संभव कार्रवाई ZZZZ होगा सही ढंग से पूरा नहीं हुआ बाद में ZZZZ की — संभवतः भ्रष्ट आगे का उपयोग करता है।

सॉकेट दुरुपयोग के खिलाफ बहुत मजबूत हैं (आईपी स्टैक को नेटवर्क विफलताओं और पैकेट को ऑर्डर से बाहर करना है), लेकिन इससे यह अच्छा अभ्यास नहीं होता है।

यदि आप "शट डाउन" ट्रैक करने के लिए ध्वज का उपयोग कर रहे हैं, तो EndConnect पर कॉल करने के लिए बेहतर और फिर सॉकेट को तुरंत बंद करें। सभी कनेक्ट स्वयं विफल होने के बाद, और एक डिस्कनेक्ट की आवश्यकता नहीं है (EndConnectSocketException फेंकता है)।

mySocket.BeginConnect(address, port, ia => { 
    if (shuttingDown) { 
    try { 
     mySocket.EndConnect(ia); 
     mySocket.BeginDisconnect(false, iaa = { 
     try { 
      mySocket.EndDisconnect(iaa); 
     } catch (Exception) { /* Ignore */ } 
     }, null); 
    } catch (SocketException) { /* Ignore */ } 
    } else { 
    // Normal connection handling 
    } 
}, null); 

इसके अलावा async डिस्कनेक्ट का उपयोग कर वहाँ अवरुद्ध से बचने के लिए: की तरह।


[1] अपवाद WinForms, जहां अपवाद स्पष्ट रूप से प्रलेखित किया गया है में Control.BeginInvoke है।

+0

@ रिचर्ड। जवाब के लिए धन्यवाद। मैंने आपके दृष्टिकोण की कोशिश की लेकिन मैं AsyncResult के बारे में अपवाद प्राप्त करता हूं जो संबंधित प्रारंभ कॉल से समान नहीं है। मैं कुछ लड़के के ब्लॉग में आया जो कहता है कि हमें AsyncResult को कैश करना चाहिए और यह जांचना चाहिए कि यह कुछ भी करने से पहले ही है। यह डोडी लगता है और वैसे भी मुझे शुरुआती बिंदु पर वापस छोड़ देता है। बस चीज़ को अनदेखा कर रहा है। – uriDium

+0

@ रिचर्ड। ठीक है वाह कुछ चीजों पर एमएसडीएन बहुत इच्छाजनक धोखा है। सबसे पहले यह कहता है: आप एक कॉलबैक विधि बना सकते हैं जो AsyncCallback प्रतिनिधि को लागू करता है और अपना नाम BeginConnect विधि में पास करता है। जो वास्तव में लगता है कि यह वैकल्पिक है। फिर अगले अनुच्छेद बताते हैं: आपकी कॉलबैक विधि को एंडकनेक्ट विधि का आह्वान करना चाहिए। उन्होंने मुझे अभी बताया कि यह वैकल्पिक है अब वे मुझे बता रहे हैं कि मुझे एंडकनेक्ट को कॉल करना चाहिए। अगर मैं "वैकल्पिक रूप से" इसे छोड़ देता हूं तो मैं एंडकनेक्ट को कॉल नहीं कर सकता। हालांकि: इस भाग ने मुझे आशा दी: BeginConnect विधि को लंबित कॉल रद्द करने के लिए, सॉकेट बंद करें। – uriDium

+0

@uriDium: कॉलबैक वैकल्पिक है, लेकिन 'एंडकनेक्ट' को कॉल करना नहीं है। इसके बजाय आप 'ICsyncResult' को 'BeginConnect'' से लौटा सकते हैं (या इसकी 'IsCompleted' संपत्ति को मतदान कर सकते हैं) और फिर कॉलबैक का उपयोग किए बिना' एंडकनेक्ट 'को कॉल करें। सारांश: 'एंडकनेक्ट' को बुलाया जाना है, लेकिन इसे 'BeginConnect' पर पास किए गए प्रतिनिधि के अंदर होने की आवश्यकता नहीं है। – Richard

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

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