2012-10-26 18 views
5

निम्नलिखित कोड ब्लॉक, सी # में किसी ऑब्जेक्ट की लोडिंग को पूर्ववत करता है।केवल एक बार कोड के ब्लॉक को पूर्ववत करना

public bool IsModelLoaded { get; set; } 
public override MyObject Load() 
    { 
     if (!IsModelLoaded) 
     { 
      Model = MyService.LoadMyObject(Model); 
      IsModelLoaded = true; 
     } 
     return Model; 
    } 

मेरा इरादा केवल एक बार इस ब्लॉक को चलाने के लिए है, और इसलिए मॉडल को केवल एक बार लोड करना है। फिर भी, यह कोड ब्लॉक 2 अलग-अलग धागे से दो बार चलाता है ..

मैं यह कैसे सुनिश्चित कर सकता हूं कि यह ब्लॉक केवल एक बार चलता है? (एकाधिकथ्रेड पर)।

धन्यवाद।

उत्तर

3

सरल

[MethodImpl(MethodImplOptions.Synchronized)] 
public override MyObject Load() 
{ 
    //snip 
} 

जोड़ते हैं, लेकिन ध्यान रखें इस पूरे वस्तु पर एक ताला ही नहीं, विधि डालता है होना करने के लिए किया जाएगा। वास्तव में महान अभ्यास नहीं है।

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx

सिंक्रनाइज़

निर्दिष्ट करता है कि विधि एक समय में केवल एक धागा द्वारा निष्पादित किया जा सकता है। स्टेटिक विधियों को प्रकार पर लॉक करें, जबकि इंस्टेंस विधियों को उदाहरण पर लॉक करें। किसी भी प्रकार के फ़ंक्शन में केवल एक थ्रेड निष्पादित हो सकता है, और केवल एक थ्रेड किसी भी वर्ग के स्थिर कार्यों में निष्पादित हो सकता है।

0

एक स्थिर वस्तु (एक बूलियन) की तरह है, तो कोड या में इसके सामने भाग गया है नहीं निर्धारित करता है कि बनाएँ अगर बयान :)

संपादित करें: मुझे यकीन है कि अगर यह threadsafe है नहीं कर रहा हूँ, तो यह हो सकता है आपके लिए समाधान नहीं है।

2

उपयोग Lazy<T> Class:

private readonly Lazy<MyObject> myObject; 

public MyClass() 
{ 
    myObject = new Lazy<MyObject>(() => 
    { 
     return MyService.LoadMyObject(); 
    }, LazyThreadSafetyMode.ExecutionAndPublication); 
} 

public bool IsModelLoaded 
{ 
    get { return myObject.IsValueCreated; } 
} 

public override MyObject Load() 
{ 
    return myObject.Value; 
} 
1

मैं singleton पैटर्न लागू करने के लिए कोशिश कर रहे हैं। लेकिन आपका संस्करण धागा सुरक्षित नहीं है। यहां और पढ़ें: http://www.dofactory.com/Patterns/PatternSingleton.aspxmyCodeBlock() बुला एक बार यह विधि है कि कुछ नहीं करता द्वारा फिर से लिखा हो जाएगा के बाद

public sealed class Singleton 
{ 
    static Singleton instance=null; 
    static readonly object padlock = new object(); 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      lock (padlock) 
      { 
       if (instance==null) 
       { 
        instance = new Singleton(); 
       } 
       return instance; 
      } 
     } 
    } 
} 
1
Action myCodeBlock =()=> 
{ 
    //do your job 
    //... 
    myCodeBlock =()=>{}; 
} 

: इस कार्यान्वयन का उपयोग करने का प्रयास करें। आपको अभी भी यह सुनिश्चित करना होगा कि इस मेटोड को सुरक्षित रूप से कहा जाता है - lock या जो कुछ भी उपयोग करें।

1

उपयोग कर सकते हैं आप धागा सुरक्षित कोड लिख सकते हैं और यह सुनिश्चित करें कि ब्लॉक केवल एक बार चलाता है बनाना चाहते हैं, तो आप इस तरह लिख सकते हैं:

private System.Object lockThis = new System.Object(); 
public override MyObject Load() 
{ 
    lock (lockThis) { 
     if (!IsModelLoaded) 
     { 
      Model = MyService.LoadMyObject(Model); 
      IsModelLoaded = true; 
     } 
    } 
    return Model; 
} 
संबंधित मुद्दे