2009-02-01 42 views
7

मैं सी # में "सही" नेटवर्क कोड लिखने के तरीके के बारे में बहुत सारे शोध कर रहा हूं।सी # नेटवर्क प्रोग्रामिंग और संसाधन उपयोग

मैंने सी # के "उपयोग" कथन का उपयोग करके कई उदाहरण देखे हैं, और मुझे लगता है कि यह एक अच्छा दृष्टिकोण है, हालांकि मैंने विभिन्न अभिव्यक्तियों के साथ इसका असंगत उपयोग देखा है।

उदाहरण के लिए, मान लीजिए कि मैं कुछ कोड इस तरह है:

TcpClient tcpClient = new TcpClient("url.com", 80); 
NetworkStream tcpStream = tcpClient.GetStream(); 
StreamReader tcpReader = new StreamReader(tcpStream); 
StreamWriter tcpWriter = new StreamWriter(tcpStream); 

जाहिर है, इस कोड को बहुत परतदार होने जा रहा है। इसलिए, मैंने कुछ कोड देखा है जो tcpClient पर उपयोग करता है, जो अच्छा लगता है। हालांकि, क्या नेटवर्कस्ट्रीम में संसाधन भी नहीं हैं जिन्हें सफाई की आवश्यकता है? StreamReader/लेखक के बारे में क्या?

क्या मुझे बयानों का उपयोग करके घोंसला में सभी 4 कथन लपेटने की ज़रूरत है?

और यदि ऐसा है, तो समय कब निपटने के लिए क्या होता है? StreamWriter स्ट्रीम बंद नहीं करेगा और परिणामस्वरूप सॉकेट? फिर क्या होता है जब StreamReader, तो NetworkStream, तो TcpClient प्रत्येक अपने निपटान के माध्यम से जाता है?

जो एक और प्रश्न लाता है। स्ट्रीम स्ट्रीमर और स्ट्रीमवाइटर दोनों एक ही स्ट्रीम से बना है, जो इसका मालिक है? क्या वे दोनों सोचते हैं कि वे इसका स्वामी हैं, और इस प्रकार दोनों इसे नष्ट करने की कोशिश करेंगे? या क्या ढांचे को पता है कि धारा पहले ही नष्ट हो चुकी है और चुपचाप इसे अनदेखा कर रही है?

ऐसा लगता है कि श्रृंखला में अंतिम विवरण के लिए केवल उपयोग कथन ही आवश्यक है, लेकिन फिर क्या होता है यदि GetStream() में कोई अपवाद डाला जाता है? मुझे नहीं लगता कि यह सॉकेट को ठीक तरह से साफ कर देगा, इसलिए ऐसा लगता है कि ऐसा नहीं होने के लिए अनावश्यक उपयोग आवश्यक हैं।

क्या किसी को नेटवर्क प्रोग्रामिंग पर .NET के साथ किसी भी अच्छी, हाल की किताबों के बारे में पता है, और prefeably C# जिसमें अपवाद हैंडलिंग और संसाधन प्रबंधन पर अध्याय शामिल हैं? या शायद कोई अच्छा लेख ऑनलाइन? मैं जो पुस्तकें पा सकता हूं वह .NET 1.1 युग (माइक्रोसॉफ्ट .NET Framework के लिए नेटवर्क प्रोग्रामिंग, नेटवर्क प्रोग्रामिंग इन .NET, आदि ..) से हैं, इसलिए ऐसा लगता है कि कुछ अच्छे संसाधनों की आवश्यकता है।

संपादित करें:

कृपया, न दें मार्क का बहुत अच्छा टिप्पणी इस :) पर टिप्पणी करने से किसी और को रोकने के

मैं किसी को भी elses पुस्तक सिफारिशों या संसाधन प्रबंधन पर राय सुनने के लिए, विशेष रूप से करना चाहते हैं असीमित उपयोग के संबंध में।

उत्तर

14

आम तौर पर, वस्तुओं को आंतरिक रूप से एकाधिक Dispose() कॉलों को संभालना चाहिए, और केवल एक बार मुख्य कोड करना चाहिए; तो Dispose() डी कई बार एक स्ट्रीम आमतौर पर एक समस्या नहीं है। निजी तौर पर, मैं using के बहुत सारे उपयोग करता हूं; ध्यान दें कि आप हालांकि (विभिन्न स्तरों अलग जीवन-बार जब तक), घोंसला इंडेंट करने के लिए की जरूरत नहीं है /:

using(TcpClient tcpClient = new TcpClient("url.com", 80)) 
using(NetworkStream tcpStream = tcpClient.GetStream()) 
using(StreamReader tcpReader = new StreamReader(tcpStream)) 
using(StreamWriter tcpWriter = new StreamWriter(tcpStream)) 
{ 
    ... 
} 

आप कहते हैं, यह सुनिश्चित करता है कि प्रारंभ के दौरान कोई त्रुटि होता है अगर, सब कुछ अभी भी साफ किया जाता है सही ढंग से। यह यह भी सुनिश्चित करता है कि प्रत्येक स्तर को किसी भी बफर किए गए डेटा, आदि के साथ सही ढंग से निपटने के लिए एक मौका (सही क्रम में) प्राप्त हो।

पुन: स्वामित्व; NetworkStream वास्तव में पहली जगह में एक विषमता है ... अधिकांश धाराएं या तो इनपुट xor आउटपुट हैं।NetworkStream कुछ नियमों को झुकता है और एक एपीआई में दो दिशाओं को दोहराता है; तो यह एक अपवाद है ... आम तौर पर स्वामित्व स्पष्ट होगा। इसके अतिरिक्त, कई रैपरों का यह निर्धारित करने के लिए एक झंडा होता है कि उन्हें लपेटा हुआ स्ट्रीम बंद करना चाहिए या नहीं। StreamReader नहीं करता है, लेकिन कुछ करते हैं (जैसे GZipStream, जिसमें leaveOpen ctor विकल्प है)। यदि आप स्वामित्व का प्रवाह नहीं करना चाहते हैं, तो यह एक विकल्प है - या गैर-समापन स्ट्रीम मध्यस्थ का उपयोग करें - एक here (NonClosingStream या इसी तरह का है)।

पुस्तकें; मैंने सी # में टीसीपी/आईपी सॉकेट की एक प्रतिलिपि बनाई: प्रोग्रामर के लिए प्रैक्टिकल गाइड "(here) - पर्याप्त, लेकिन महान नहीं।

+0

प्रतिक्रिया के लिए धन्यवाद। यह काफी हद तक मुझे संदेह है। मैं सहमत हूं, नेटवर्कस्ट्रीम एक विषमता है। मुझे यकीन नहीं है कि अलग-अलग पढ़ने और लिखने वाली धाराएं बनाने के लिए यह कोई समस्याग्रस्त नहीं होता है, लेकिन यह वही है। पुस्तक के पुनर्मूल्यांकन के लिए धन्यवाद। –

+0

इसके अलावा, मैंने आपके द्वारा उल्लिखित साइट पर एक NonClosingStream कार्यान्वयन नहीं देखा था। –

+0

यह वहां है - MiscUtil.IO.NonClosingStreamWrapper –

0

यदि कोई ऑब्जेक्ट IDISposable का समर्थन करता है, तो इसे {} ब्लॉक में उपयोग करना सबसे अच्छा है क्योंकि निपटान विधि स्वचालित रूप से आपके लिए कॉल हो जाती है। यह आपके हिस्से पर कम कोड भी बनाता है। किसी भी अपवाद को संभालने में 'उपयोग' का उपयोग करना नोट करना महत्वपूर्ण है। यदि आप किसी भी त्रुटि को संभालना चाहते हैं तो आपको अभी भी ऐसा करना होगा। एक बार उपयोग ब्लॉक गुंजाइश से बाहर हो जाता है, तो आपकी वस्तु भी होती है।

Old Style Code 

object obj; 

try 
{ 
    obj= new object(); 
    //Do something with the object 
} 
catch 
{ 
    //Handle Exception 
} 
finally 
{ 

    if (obj != null) 
    { 
    obj.Dispose(); 
    } 
} 

Newer Style Code 

try 
{ 
    using (object obj = new object()) 
    { 
    //Do something with the object 
    } 
catch 
{ 
    //Handle Exception 
} 
-1

सॉकेट के बारे में क्या? यह करने के लिए ठीक है:

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
serverSocket.Connect(serverEndPoint, m_NegotiationPort); 
. 
. 
. 
serverSocket.Close(); 

या बेहतर

using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
{ 
. 
. 
. 
} 
संबंधित मुद्दे