ठीक है, मेरे पास मेरे कोड से एक अजीब अपवाद है जो मुझे उम्र के लिए परेशान कर रहा है।WSACancelBlockingCall अपवाद
System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
at System.Net.Sockets.Socket.Accept()
at System.Net.Sockets.TcpListener.AcceptTcpClient()
MSDN इस पर बहुत उपयोगी नहीं है: http://msdn.microsoft.com/en-us/library/ms741547(VS.85).aspx और मैं भी कि यह कैसे एक समस्या निवारण शुरू करने के लिए पता नहीं है। यह केवल दिन में 4 या 5 बार फेंक दिया जाता है, और हमारे परीक्षण वातावरण में कभी नहीं। केवल उत्पादन साइटों में, और सभी उत्पादन साइटों पर।
मुझे इस अपवाद के बारे में पूछने के लिए बहुत सी पोस्ट मिल गई हैं, लेकिन इसके कारण होने पर कोई वास्तविक निश्चित उत्तर नहीं है, और इसे कैसे संभालना या रोकना है।
कोड एक अलग पृष्ठभूमि धागा में चलता है, विधि शुरू होता है:
public virtual void Startup()
{
TcpListener serverSocket= new TcpListener(new IPEndPoint(bindAddress, port));
serverSocket.Start();
तो मैं एक पाश एक अलग थ्रेड पूल में नौकरियों के रूप में सभी नए कनेक्शन डाल चलाते हैं। यह एप्लिकेशन वास्तुकला की वजह से और अधिक जटिल हो जाता है, लेकिन मूल रूप से:
while ((socket = serverSocket.AcceptTcpClient()) !=null) //Funny exception here
{
connectionHandler = new ConnectionHandler(socket, mappingStrategy);
pool.AddJob(connectionHandler);
}
}
वहाँ से, pool
अपने आप धागे कि उसके अपने सूत्र में हर काम का ख्याल रखना है, अलग से है।
मेरी समझ यह है कि AcceptTcpClient() एक अवरुद्ध कॉल है, और किसी भी तरह winsock थ्रेड को अवरुद्ध करने और निष्पादन जारी रखने के लिए कह रहा है .. लेकिन क्यों? और मुझे क्या करना चाहिए? बस अपवाद पकड़ो और इसे अनदेखा करें?
ठीक है, मुझे लगता है कि कुछ अन्य थ्रेड सॉकेट बंद कर रहा है, लेकिन यह निश्चित रूप से मेरे कोड से नहीं है। मैं क्या जानना चाहता हूं: क्या यह सॉकेट कनेक्टिंग क्लाइंट (सॉकेट के दूसरी तरफ) द्वारा बंद है या यह मेरे सर्वर द्वारा बंद है। चूंकि यह इस पल में है, जब भी यह अपवाद होता है, तो यह मेरी सुनवाई बंदरगाह को बंद कर देता है, जो प्रभावी रूप से मेरी सेवा बंद कर देता है। यदि यह किसी दूरस्थ स्थान से किया जाता है, तो यह एक बड़ी समस्या है।
वैकल्पिक रूप से, क्या यह केवल आईआईएस सर्वर मेरे आवेदन को बंद कर सकता है, और इस प्रकार मेरे सभी पृष्ठभूमि धागे और अवरुद्ध तरीकों को रद्द कर सकता है?
कहें कि यह है। आप इसे किसी अन्य धागे से कैसे बंद करते हैं? क्या सॉकेट को 'अस्थिर' होना चाहिए? –
नहीं, जब तक अन्य धागे में सॉकेट ऑब्जेक्ट का संदर्भ हो, तब तक यह इसे बंद कर सकता है। – TimK
यदि आप ब्लॉक स्थिति में हैं तो आप उसी थ्रेड से सॉकेट को कैसे बंद कर सकते हैं ??? –