2012-04-13 14 views
10

Socket.BeginSend() विधि पर विचार करें। यदि दो थ्रेड पूल धागे इस विधि को एक साथ कॉल करने के लिए थे, तो क्या उनके संबंधित संदेश एक-दूसरे के साथ मिलकर खत्म हो जाएंगे या सॉकेट क्लास इसे होने से रोकता है?असिंक्रोनस एक सॉकेट थ्रेड को सुरक्षित लिखते हैं?

+1

हालांकि यह काम करेगा, आपको केवल यूपीपी जैसे अविश्वसनीय ऑर्डरिंग डेटाग्राम आधारित प्रोटोकॉल के साथ ऐसा करना चाहिए। कारण यह है कि यदि दो धागे BeginSend को कॉल करने की दौड़ करते हैं, तो आप स्रोत पर भेजने के आदेश से बाहर हो सकते हैं। टीसीपी का उपयोग करते समय इसका परिणाम डेटा भ्रष्टाचार होगा। –

उत्तर

7

मुझे एक परिचित post on the MSDN forum मिला जो आपके प्रश्न का उत्तर देने लगता है।

  1. आप एक साथ कई BeginSends कतार कर सकते हैं। आप लॉक करने के लिए की जरूरत नहीं है

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

इससे भी अधिक दिलचस्प जानकारियां:

आप नीचे Remark section of the MSDN doc BeginSend() में एक सा स्क्रॉल हैं, तो आप कॉलबैक के दिलचस्प उपयोग मिलेगा विधियां जो आपके लिए प्रासंगिक हो सकती हैं।

[...] यदि आप BeginSend विधि को कॉल करने के बाद मूल थ्रेड को ब्लॉक करना चाहते हैं, तो WaitHandle.WaitOne विधि का उपयोग करें। [...]

+1

मुझे यह नहीं पता था, धन्यवाद! – covertCoder

+1

यह वही है जो मैं खोज रहा था! धन्यवाद! – Dabloons

11

.NET सॉकेट उदाहरण कुछ तरीकों (समान या अलग-अलग) के साथ एक साथ कॉल में थ्रेड-सुरक्षित नहीं हैं असंगत स्थिति का कारण बन सकता है। हालांकि, BeginSend() और BeginReceive() विधियां के संबंध में थ्रेड-सुरक्षित हैं।

प्रत्येक (या दोनों) को कई बकाया कॉल रखना सुरक्षित है।

BeginReceive() के मामले में, जब वे ऑर्डर में डेटा उपलब्ध होते हैं तो उन्हें सेवा दी जाएगी। यह उपयोगी हो सकता है, उदाहरण के लिए, आपकी प्रसंस्करण लंबी है लेकिन आप चाहते हैं कि अन्य जितनी जल्दी हो सके। बेशक इस मामले में आप अपने कोड को एकाधिक रसीदों को एक साथ संसाधित कर सकते हैं और आपको अपने आवेदन स्थिति की सुरक्षा के लिए अपने स्वयं के सिंक्रनाइज़ेशन तर्क की आवश्यकता हो सकती है।

BeginSend() के मामले में, प्रत्येक कॉल सॉकेट बफर में भेजे गए डेटा पुश करने के लिए प्रयास करेंगे, और जैसे ही यह वहाँ स्वीकार किया जाता है, अपने कॉलबैक (जहां EndSend() कॉल करेंगे) कहा जाएगा। अगर किसी भी कॉल के लिए अपर्याप्त बफर स्पेस है, तो यह ब्लॉक हो जाएगा।

नोट: यह न मानें कि डिफ़ॉल्ट 8k बफर का अर्थ है "मैं जल्दी से वास्तव में डेटा है, तो यह अवरुद्ध कर देगा के 8k साथ BeginSend() कॉल कर सकते हैं" निम्नलिखित के रूप में सत्य हैं:

  1. 8K है एक "मामूली आकार" संख्या, और बफर हटना और कुछ हद तक बढ़ने

  2. सकता है आप कॉल की 8K लायक अप queing कर रहे हैं, डाटा नेटवर्क को कम करने पर भेजा जा रहा हो जाएगा कि कतारबद्ध डेटा की 8K

सामान्य में:

  • यदि आप एक धागा भीतर BeginSend() कई बार कहते हैं, आप आश्वासन दिया जाता है जिस क्रम में वे कहा जाता था में मशीन छोड़ देंगे भेजता है।

  • यदि आप कई धागे से BeginSend() पर कॉल करते हैं, तब तक आदेश की कोई गारंटी नहीं है जब तक कि आप किसी अन्य विशिष्ट क्रम में वास्तविक कॉल को लागू करने के लिए कुछ अन्य अवरोध तंत्र का उपयोग न करें। हालांकि प्रत्येक कॉल नेटवर्क बाइट्स की एक संगत धारा में अपना डेटा सही तरीके से भेज देगा।

+0

आपका उत्तर मूल प्रश्न के कुछ साल बाद आया और मैं इसे अभी देख रहा हूं (एक और साल बाद) लेकिन मैं चाहता हूं कि आप यह जान लें कि इसमें बहुत विस्तार हुआ है और मैं वास्तव में इसकी सराहना करता हूं। हालांकि, नेट फ्रेमवर्क और डेवलपर के रूप में मेरा कौशल का मेरा व्यक्तिगत ज्ञान अब इस प्रश्न से बहुत दूर है, यह उत्तर भविष्य के पाठकों के लिए एक महान संसाधन होगा। अगर मैंने पहले से ही सही उत्तर के रूप में उत्तर नहीं दिया था, तो मैं आपको सही उत्तर दूंगा। बहुत सराहना की। – Dabloons

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