2009-07-21 12 views

उत्तर

21

बिल्कुल! स्ट्रीम पर बस Read(...) पर कॉल करें। डेटा उपलब्ध होने तक यह अवरुद्ध होगा। जब तक आप वास्तव में पर TcpClient का उपयोग करने के लिए सीधे, मैं सामान्य रूप से स्ट्रीम पर जितना संभव हो उतना करता हूं। यदि आप सॉकेट का उपयोग करना चाहते हैं, तो बस Receive(byte[]) पर कॉल करें जो डेटा उपलब्ध होने तक अवरुद्ध होगा (या सॉकेट बंद है)।

अब यदि आप ब्लॉक नहीं करना चाहते हैं, तो आप Stream.BeginRead या Socket.BeginReceive का उपयोग असीमित रूप से काम करने के लिए कर सकते हैं। (। या ReadAsync .NET 4.5) के रूप में

मैं व्यक्तिगत रूप से लगता है Available काफी बेकार होने के लिए और एक सोने के साथ दौर पाशन निश्चित रूप से अक्षम है (दोनों नदियों और सॉकेट पर) - आप संदर्भ स्विच करने के लिए नहीं करना चाहते हैं थ्रेड जब डेटा नहीं आया है, और जब आप डेटा में आते हैं तो नींद समाप्त होने की प्रतीक्षा नहीं करनी चाहिए।

+0

StreamReader.ReadToEnd() का उपयोग करना भी काम करना चाहिए? –

+0

@ जेडर: केवल अगर यह दूसरे छोर से टेक्स्ट पास कर रहा है * और * यह भेजना समाप्त होने पर सॉकेट बंद कर देगा। HTTP KeepAlive कनेक्शन के लिए अच्छा नहीं है, उदाहरण के लिए। –

+1

@tig: यदि 'रीडलाइन' शून्य वापस आती है, तो इसका मतलब है कि स्ट्रीम बंद कर दी गई है और कोई और लाइन उपलब्ध नहीं है। यह वास्तव में लगता है जैसे आपको नेटवर्क स्तर पर क्या हो रहा है, उदाहरण के लिए देखना चाहिए। Wireshark के साथ। –

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