2013-02-22 54 views
6

में सिंक्रनाइज़ किए गए तरीकों सी # में जावा एप्लिकेशन को पोर्ट करने का हिस्सा सी # में एक सिंक्रनाइज़ किए गए संदेश बफर को कार्यान्वित करना है। सिंक्रनाइज़ करके मेरा मतलब है कि थ्रेड के लिए इसे लिखना और संदेशों को पढ़ने और पढ़ने के लिए सुरक्षित होना चाहिए।सी #

जावा में इसे synchronized विधियों और wait() और notifyAll() का उपयोग करके हल किया जा सकता है।

उदाहरण:

public class MessageBuffer { 
    // Shared resources up here 

    public MessageBuffer() { 
     // Initiating the shared resources 
    } 

    public synchronized void post(Object obj) { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff 
    } 

    public synchronized Object fetch() { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff and return the object 
    } 
} 

मैं सी # में कुछ इसी तरह कैसे प्राप्त कर सकते हैं?

+1

संबंधित: http://stackoverflow.com/questions/541194/c-sharp-version-of-javas-synchronized-keyword – sshow

+0

@stigok संबंधित नहीं है, यह एक डुप्लिकेट –

+0

डुप्लिकेट नहीं है, उन्होंने प्रतीक्षा का उल्लेख नहीं किया है() और सूचित करें() – Dimme

उत्तर

4

इस प्रयास करें:

using System.Runtime.CompilerServices; 
using System.Threading; 

public class MessageBuffer 
{ 
    // Shared resources up here 

    public MessageBuffer() 
    { 
     // Initiating the shared resources 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual void post(object obj) 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual object fetch() 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff and return the object 
    } 
} 
+3

मुझे MethodImplOptions का उपयोग करना पसंद नहीं है। सिंक्रनाइज़ किया गया क्योंकि यह " प्रत्येक विधि के लिए इसे लॉक करें। और "इसे लॉक करें" थोड़ा सा डोडी माना जाता है क्योंकि यह डेडलॉक की संभावनाओं को बढ़ाता है। –

+1

मैं @ मैथ्यू वाटसन से सहमत हूं। आपको MethodImplOptions से सिंक्रनाइज़ करना चाहिए और इसके बजाय स्पष्ट ताले का उपयोग करना चाहिए। – Patrik

+0

प्रश्न यह था कि सी # में इसे कैसे प्राप्त किया जाए, न कि अधिक पसंद किया जा सकता है। –

6

नेट में आप की तरह में

object oLock = new object(); 
lock(oLock){ 
    //do your stuff here 
} 

आप के लिए क्या देख रहे हैं mutexes या घटनाओं हैं lock -statement उपयोग कर सकते हैं। आप ManualResetEvent श्रेणी का उपयोग करें और के माध्यम से

ManualResetEvent mre = new ManualResetEvent(false); 
... 
mre.WaitOne(); 

एक धागा इंतजार कर सकते हैं अन्य धागा अंततः

mre.Set(); 

अन्य धागा यह जारी रख सकते हैं कि संकेत करने के लिए कहता है।

देखें here

+0

'मैनुअल रीसेट' को 'म्यूटेक्स' सेमफोर के लिए प्रतिस्थापित किया जा सकता है? – Dimme

+1

हां, लेकिन आपको उनमें से दो की आवश्यकता होगी। प्रत्येक धागे को संकेत देने के लिए एक। इस तरह, जब थ्रेड ने इस ऑब्जेक्ट को सिग्नल करने के लिए एक ऑब्जेक्ट बनाया और दूसरा सिग्नल करने के लिए कि ऑब्जेक्ट का उपभोग किया गया है। बेशक, यदि आप कई वस्तुओं को बनना चाहते हैं, तो आप एक अलग दृष्टिकोण चुन सकते हैं। यह स्थिति पर निर्भर करता है। लेकिन घटनाक्रम कई स्थितियों के अनुरूप है। कृपया [एमएसडीएन] पर दस्तावेज़ देखें (http://msdn.microsoft.com/en-us/library/ms173179.aspx)। –