2009-02-19 26 views
10

सॉकेट कॉल करने के बाद। शट डाउन, सॉकेट। क्लोज़ और सॉकेट। डिस्कनेक्ट करें, ऐसा लगता है कि सॉकेट। ReceiveAsync निरस्त नहीं होता है। प्रयास ReceiveAsync कॉल (सबसे अच्छा अभ्यास के रूप में दस्तावेज में सुझाव दिया) में इस्तेमाल SocketAsycEventArgs वस्तु त्रुटि में परिणाम पुन: उपयोग करने:सॉकेट.xxxxAsync कॉल को रद्द करना

An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance

क्या मैं ReceiveAsync इस SocketAsyncEventArgs उदाहरण पर अपनी पकड़ जारी करने के लिए पाने के लिए क्या करना होगा?

संपादित करें: मैंने लंबित प्राप्त करने के लिए इस पर काम किया है और प्राप्त होने तक कोई सफाई नहीं कर रहा है (यानी पूरा प्रेषित किया गया है)। हालांकि बहुत अच्छा महसूस नहीं करता है। क्या WebRequest API की तरह इसे अभी छोड़ा नहीं जा सकता है?

उत्तर

6

एसिंक्रोनस प्राप्त करने को रोकने का कोई तरीका नहीं दिखता है।

जब सॉकेट बंद हो जाता है, तो यह प्राप्त करने के लिए मजबूर करता है, और आपकी कॉलबैक विधि में सॉकेटएसिंसेन्टएआरएआर पैरामीटर की सॉकेट त्रुटि संपत्ति SocketError.OperationAborted का मान रखेगी। जब इस स्थिति का सामना किया जाता है, तो आप पुन: प्रयोज्य पूल में SocketAsyncEventArgs ऑब्जेक्ट को वापस कर सकते हैं।

यह here दिखाया गया उदाहरण में प्रदर्शित किया गया है। विशेष रूप से, ProcessReceive() विधि को देखें, जो e.BytesTransferred == 0 या e.SocketError != SocketError.Success पर CloseClientSocket() विधि को कॉल करता है। CloseClientSocket() विधि वह जगह है जहां SocketAsyncEventArgs ऑब्जेक्ट पूल में लौटा दिया जाता है।

0

सबसे संभावित कारण जब SocketAsyncEventArgs कि आप बुला रहे हैं पुन: उपयोग है:

SAE.Completed + = नए eventhandler (SocketEventArg_Completed);

ऐसा करने से आपके कॉलबैक को कई बार बुलाया जाएगा !!!

केवल एक बार पूर्ण हैंडलर सेट करना सुनिश्चित करें।

+0

यह उत्पन्न प्रश्न का उत्तर देने का प्रयास नहीं करता है। ओपी का मुद्दा 'पूर्ण' हैंडलर को निकाल दिया जाने से पहले 'सॉकेटएसिंक एवेन्ट आर्ट्स' का पुन: उपयोग करने का प्रयास करने से आता है। – binki

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