2010-03-09 20 views
6

मैं एक विरासत आरपीसी कार्यान्वयन के लिए क्लाइंट/सर्वर लाइब्रेरी पर काम कर रहा हूं और आरपीसी अनुरोध संदेश को प्रतिक्रिया संदेश प्राप्त करने का इंतजार करते समय क्लाइंट कभी-कभी लटकाएगा, जहां मुद्दों पर चल रहा था। यह पता चला है कि वास्तविक संदेश मेरे संदेश फ़्रेमिंग कोड में था (अंतर्निहित NetworkStream से डेटा पढ़ने पर मैं संदेश सीमाओं को सही तरीके से संभाल नहीं रहा था), लेकिन यह मुझे उस कोड के बारे में भी संदेह कर रहा था जिसका उपयोग मैं नेटवर्क पर डेटा भेजने के लिए कर रहा था, विशेष रूप से ऐसे मामले में जहां आरपीसी सर्वर क्लाइंट आरपीसी अनुरोध के परिणामस्वरूप ग्राहक को बड़ी मात्रा में डेटा भेजता है।स्ट्रीम है। थ्रेड-सुरक्षित?

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

मान लीजिए मैं एक Send विधि है एक NetworkStream:

public void Send(Message message) 
{ 
    //Write the message to a temporary stream so we can send it all-at-once 
    MemoryStream tempStream = new MemoryStream(); 
    message.WriteToStream(tempStream); 

    //Write the serialized message to the stream. 
    //The BinaryWriter is a little redundant in this 
    //simplified example, but here because 
    //the production code uses it. 
    byte[] data = tempStream.ToArray(); 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write(data, 0, data.Length); 
    bw.Flush(); 
} 

तो सवाल मैं है, अंतर्निहित Stream के लिए bw.Write (करने के लिए और निहितार्थ से कॉल है Write विधि) परमाणु? यही है, यदि भेजने वाले धागे पर एक लंबा Write अभी भी प्रगति पर है, और दिल की धड़कन धागा एक पिंग संदेश भेजता है और भेजता है, तो वह Write कॉल खत्म होने तक थ्रेड ब्लॉक करेगा, या मुझे Send पर स्पष्ट सिंक्रनाइज़ेशन जोड़ना होगा स्ट्रीम को क्लॉबरिंग से दो Send कॉल को रोकने के लिए विधि?

उत्तर

8

किसी भी सार्वजनिक स्थिर इस प्रकार के सदस्यों (दृश्य बेसिक में साझा) धागा सुरक्षित हैं। कोई भी उदाहरण सदस्य थ्रेड सुरक्षित होने की गारंटी नहीं है।

Stream Class से

, तो कोई यह गारंटी नहीं है।

+1

मैंने यह भी देखा, लेकिन चूंकि यह अस्वीकरण बीसीएल में लगभग हर वर्ग में लागू होता है, इसलिए मुझे आश्चर्य हुआ कि 'स्ट्रीम' के लिए अपवाद हो सकता है कि मैंने दस्तावेज़ में कहीं और अनदेखा किया हो। –

+1

मुझे खेद है, लेकिन यह नहीं कि मुझे पता है। सुनिश्चित करें कि कोड के इस खंड को सुरक्षित रखने के लिए आप इसे अपने हाथों में ले जाएं। –

+1

क्षमा करने की कोई आवश्यकता नहीं है;)। मैं सहमत हूं कि स्पष्ट सिंक्रनाइज़ेशन जोड़ना किसी भी घटना में सुरक्षित और तार्किक बात होगी। मैं केवल उत्सुक था अगर यह पहले से ही 'स्ट्रीम-इन' में 'स्ट्रीम' था, क्योंकि "थ्रेड-सुरक्षित" अस्वीकरण संभावना को छूट नहीं देता है। एमएसडीएन कई बार अस्पष्ट होने लगता है। –

2

यह परमाणु के रूप में प्रलेखित नहीं है। मैं यह नहीं मानूंगा कि यह निश्चित रूप से एक कस्टम लॉकिंग तंत्र के आसपास उस सामान को लपेट देगा। मूल रूप से पूरी भेजें विधि लॉक के लिए काफी पूछती है।

0

आपको लेखक को दोनों थ्रेडों में निश्चित रूप से लॉक करना चाहिए। अफवाह लेखक धागा सुरक्षित नहीं है।

"मॉनीटर" और "म्यूटेक्स" के लिए एमएसडीएन की जांच करें।

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