उपयोग किए जाने पर बस लटकता है मैं पहली बार नामित पाइप का उपयोग करने की कोशिश कर रहा हूं। एमएस प्रलेखन here पाया में, यह कहा गया है कि:NamedPipeServerStream.EndWaitForConnection()
EndWaitForConnection BeginWaitForConnection के लिए हर कॉल के लिए ठीक एक बार बुलाया जाना चाहिए।
तो मैं एक अच्छा थोड़ा प्रोग्रामर हो सकता है और दस्तावेज़ का पालन करने की कोशिश कर रहा हूँ, लेकिन जब मैं इसका इस्तेमाल EndWaitForConnection()
सिर्फ अनिश्चित काल के लिए लटकी हुई है।
इसलिए मैंने अपना कोड कम से कम घटा दिया ताकि देखें कि क्या मैं समस्या को अलग कर सकता हूं लेकिन कोई पासा नहीं। मैंने लिखे गए वर्ग से निम्नलिखित कोड खींचा है। मैं इसे संशोधित किया है जिससे वह तो एक पाइप कनेक्शन पर इंतजार कर शुरू होता है तुरंत कि पाइप कनेक्शन पर इंतजार कर बंद करने के लिए कोशिश करता है:
private void WaitForConnectionCallBack(IAsyncResult result)
{
}
public void Start()
{
var tempPipe = new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult result = tempPipe.BeginWaitForConnection(
new AsyncCallback(WaitForConnectionCallBack), this);
tempPipe.EndWaitForConnection(result); // <----- Hangs on this line right here
}
1) क्यों यह EndWaitForConnection()
पर लटका करता है? यदि मैं कनेक्शन प्राप्त करने से पहले अपने सर्वर को बंद करना चाहता हूं, तो मैं अनिवार्य रूप से इस BeginWaitForConnection()
कॉलबैक को कैसे रद्द कर सकता हूं?
2) मान लीजिए कि मेरे ऊपर उल्लिखित समस्या नहीं है। क्या होता है यदि 2 क्लाइंट मेरे नामित पाइप से कनेक्ट करने का प्रयास करते हैं?
क्या मुझे उनमें से प्रत्येक के लिए कॉलबैक आमंत्रण मिलता है, या मुझे पहले कनेक्शन अधिसूचना प्राप्त करने के लिए इंतजार करना है, तो फिर अगले ग्राहक को फिर से सुनना शुरू करने के लिए EndWaitForConnection()
फिर WaitForConnectionCallBack()
पर कॉल करें?
उत्तरार्द्ध मुझे दौड़ की स्थिति की तरह लगता है, क्योंकि मैं कनेक्शन श्रोता को पर्याप्त तेज़ी से स्थापित नहीं कर सकता।
डिज़ाइन द्वारा, कॉल केवल आपके कॉलबैक विधि (WaitForConnectionCallBack) में उपयोग की जानी चाहिए। आप tempPipe.Close() को कॉल करके इसे रद्द कर दें। –
हां, मैं उस निष्कर्ष पर खुद का हुआ। मुझे मूल रूप से पता चला कि tempPipe.Close() को कॉलबैक रूटीन तुरंत चल रहा है, समस्या यह है कि मैंने इसे एंडवेटफॉरकनेक्शन को तुरंत कॉल करने के लिए स्थापित किया है, लेकिन तब से पाइप बंद हो जाने के बाद, यह अपवाद फेंकता है। तो मुझे इसके चारों ओर एक कोशिश कथन लपेटना पड़ा और पकड़ बयान में कुछ भी नहीं करना पड़ा। क्या यह सही समाधान है? यह पाइप को बंद करने के लिए मेरे लिए थोड़ा सा मैला लगता है, यह जानकर कि यह आपके कॉलबैक में अपवाद को मजबूर करेगा जो आपको पकड़ना होगा। – Ultratrunks
यह पूरी तरह से सामान्य है। –