मैं TcpClient.BeginConnect/TcpClient.EndConnect
कॉम्बो के साथ अपने सर्वर से कनेक्ट करने का प्रयास कर रहा हूं। हालांकि, कुछ चीजें काम नहीं करतीं जैसी उन्हें चाहिए।टीसीपी क्लाइंट.एंडकनेक्ट सॉकेट बंद होने पर NullReferenceException फेंकता है
परिदृश्य इस प्रकार है:
TcpClient.BeginConnect
- सर्वर से कॉल जानबूझकर ऑफ़लाइन (परीक्षण प्रयोजनों के लिए) है - इस प्रकार का कोई संबंध नहीं बनाया जा सकता है।
- मैं बंद आवेदन
TcpClient
कनेक्शन कॉलबैक विधि दियाIAsyncResult
NullReferenceException
साथ दे रही है क्या होता हैTcpClient.EndConnect
विधि के लिएIAsyncResult
- कॉल (
client.Close()
प्रक्रिया है जिसके closes the socket which in turn stops the async operation में बुलाया जाता है)EndConnect
पर होता है () - चूंकि अंतिम रूप (विंडो) बंद था, ऐप से बाहर निकलना चाहिए - हालांकि यह नहीं करता टी, कम से कम
BeginConnect
ऑपरेशन पूरा नहीं होता है (जो अजीब है, क्योंकि कॉलबैक पहले से ही कॉल किया जा चुका है)।
यहाँ क्या होता है कि एक NullReferenceException
पकड़ा जाता है। जैसा कि आप ऊपर की तस्वीर से देख सकते हैं, न तो client
और न ही ar
null
हैं। समस्या यह है कि MSDN documentation for the EndConnect उस मामले का उल्लेख नहीं करता है जिसमें इस अपवाद को फेंक दिया गया है।
तो मूल रूप से, मुझे नहीं पता कि क्या हो रहा है। समस्या यह है कि मुझे ऐप को बंद करने की प्रतीक्षा करने के लिए मजबूर होना पड़ता है (जैसे कनेक्शन ऑपरेशन अभी भी टाइमआउट के लिए इंतजार कर रहा है)। यदि कोई सर्वर ऑनलाइन है, तो यह ठीक से कनेक्ट और डिस्कनेक्ट हो जाता है।
क्याNullReferenceException
इस संदर्भ में मतलब है? कनेक्शन स्थापित नहीं होने पर आवेदन बंद करने के लिए BeginConnect
ऑपरेशन से कैसे बचें?
अतिरिक्त नोट्स (टिप्पणी में अनुरोध किया):
public void Connect()
{
try
{
lock (connectionAccess)
{
if (State.IsConnectable())
{
// Create a client
client = new TcpClient();
client.LingerState = new LingerOption(false, 0);
client.NoDelay = true;
State = CommunicationState.Connecting;
client.BeginConnect(address, port, onTcpClientConnectionEstablished, null);
}
else
{
// Ignore connecting request if a connection is in a state that is not connectable
}
}
}
catch
{
Close(true);
}
}
इसके अलावा बंद विधि:
यहाँ ग्राहक (क्लाइंट एक सदस्य चर रहा है बनाने के लिए कोड है:
public void Close(bool causedByError)
{
lock (connectionAccess)
{
// Close the stream
if (clientStream != null)
clientStream.Close();
// Close the gateway
if (client != null)
client.Close();
// Empty the mailboxes
incomingMailbox.Clear();
outgoingMailbox.Clear();
State = causedByError ? CommunicationState.CommunicationError : CommunicationState.Disconnected;
}
}
InnerException क्या शून्य था के बारे में कोई अधिक जानकारी दे रहा है? – Tremmors
@Tremmors नहीं। InnerException शून्य है। StackTrace से भी कोई मदद नहीं (onTcpClientConnectionEstablished> EndConnect)। :( –
हाँ, स्पष्ट रूप से एक रूपरेखा बग। मामले कि TcpClient() EndConnect से पहले बंद कर दिया है कहा जाता है यह ObjectDisposedException फेंक माना जाता है में। मैं बजाय पहले एक या दो बार NullReferenceException पाने के लिए लग रहे हैं, तो यह ObjectDisposedException फेंकने शुरू कर देंगे जैसा कि अपेक्षित है। मेरा सुझाव है कि आप इसे उसी तरह संभालें जैसा कि आप ऑब्जेक्ट डिस्प्लेएक्सप्शन (यानी "कनेक्शन का समय समाप्त/असफल/जो भी अन्य कारण आपने बंद किया था)(), हालांकि, मुझे नहीं पता कि कोई संसाधन लीक हो सकता है या नहीं यहां से एंडकनेक्ट() पूरा नहीं हो रहा है। शायद जीसी के साथ सौदा नहीं कर सकता है। :) – Tom