मेरे अपने वेब सर्वर सॉफ्टवेयर में, मैं सर्वर है कि निम्न स्टैक ट्रेस शामिल पर ईवेंट व्यूअर में प्रविष्टियों हो रही है:.NET थ्रेडिंग/टीसीपी कनेक्शन स्वीकार करने में NullReferenceException का कारण क्या होता है?
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentNullException
Stack:
at System.Net.FixedSizeReader.ReadCallback(System.IAsyncResult)
at System.Net.LazyAsyncResult.Complete(IntPtr)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Net.ContextAwareResult.Complete(IntPtr)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
जरूरत नहीं कहने के लिए, इस प्रक्रिया है, जिसका अर्थ सर्वर नीचे चला जाता है दुर्घटनाओं।
चूंकि कोई भी स्टैकट्रैक मेरा कोड नहीं बताता है, इसलिए मैं काफी परेशान हूं। क्या यह .NET में एक बग है? यदि हां, तो क्या कोई ज्ञात कामकाज है? या क्या इस विशेष अपवाद के लिए एक ज्ञात कारण है?
स्टैकट्रैस में उल्लिखित CompletionPortCallback
नाम मुझे विश्वास दिलाता है कि ऐसा तब होता है जब सर्वर आने वाले टीसीपी कनेक्शन को स्वीकार करने का प्रयास करता है, इसलिए मैं नीचे के लिए प्रासंगिक कोड शामिल करने जा रहा हूं। बेशक, अगर आपको लगता है कि समस्या कहीं और है तो मुझे अन्य कोड शामिल करने में खुशी होगी।
BeginAccept
करने के लिए कॉल इस तरह दिखता है:
यहाँ, _listeningSocket
प्रकार System.Net.Sockets.Socket
की है।
acceptSocket
विधि नीचे दिखाया गया है। मैं यह मानने जा रहा हूं कि टिप्पणियां कोड को पर्याप्त रूप से समझाती हैं; यदि नहीं, तो मुझे एक टिप्पणी में स्पष्ट करने में खुशी हुई। चूंकि यह कोड लाइव सर्वर पर रिलीज मोड में चलता है, #if DEBUG
निश्चित रूप से गलत होगा।
private void acceptSocket(IAsyncResult result)
{
#if DEBUG
// Workaround for bug in .NET 4.0 and 4.5:
// https://connect.microsoft.com/VisualStudio/feedback/details/535917
new Thread(() =>
#endif
{
// Ensure that this callback is really due to a new connection (might be due to listening socket closure)
if (!IsListening)
return;
// Get the socket
Socket socket = null;
try { socket = _listeningSocket.EndAccept(result); }
catch (SocketException) { } // can happen if the remote party has closed the socket while it was waiting for us to accept
catch (ObjectDisposedException) { }
catch (NullReferenceException) { if (_listeningSocket != null) throw; } // can happen if StopListening is called at precisely the "wrong" time
// Schedule the next socket accept
if (_listeningSocket != null)
try { _listeningSocket.BeginAccept(acceptSocket, null); }
catch (NullReferenceException) { if (_listeningSocket != null) throw; } // can happen if StopListening is called at precisely the "wrong" time
// Handle this connection
if (socket != null)
HandleConnection(socket);
}
#if DEBUG
).Start();
#endif
}
जहां तक मुझे पता है कि आपको '_listeningSocket' को 'startAccept()' कॉल में शून्य के बजाय कॉल करना होगा:' _listeningSocket.BeginAccept (acceptSocket, _listeningSocket); 'दस्तावेज़ और उदाहरण देखें। यही कारण है कि आप ArgumentNull अपवाद प्राप्त किया। –
यह स्पष्ट रूप से .NET ढांचे में एक बग है। यदि आपने एपीआई को msiused किया था तो त्रुटि आईओ कॉलबैक पर बीसीएल के आंतों में गहराई से नहीं होती थी। सवाल यह है कि इसके आसपास कैसे काम करना है। – usr