2012-10-26 13 views
5

Der folgende Codeblock preformiert das Laden eines Objekts in C#.Vorbereiten eines Codeblocks nur einmal

Meine Absicht ist es, diesen Block nur einmal auszuführen und das Modell nur einmal zu laden. Dennoch läuft dieser Codeblock zweimal aus 2 verschiedenen Threads.

Wie kann ich sicherstellen, dass dieser Block nur einmal ausgeführt wird? (auf mehreren Threads).

Vielen Dank.

Antwort

3

Simplest würde

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

aber bewusst sein, dies stellt eine Sperre für das gesamte Objekt, nicht nur die Methode hinzuzufügen sein. Nicht wirklich tolle Übung.

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

Synchronisierte

Gibt an, daß das Verfahren nur von einem Thread zu einem Zeitpunkt ausgeführt werden kann. Statische Methoden sperren den Typ, während Instanzmethoden die Instanz sperren. Nur ein Thread kann in einer der Instanzfunktionen ausgeführt werden, und nur ein Thread kann in einer der statischen Funktionen einer Klasse ausgeführt werden.

0

ein statisches Objekt erstellen (wie ein boolean), dass der Code bestimmt, ob hat läuft oder nicht, indem sie in einer if-Anweisung :)

EDIT setzen: Ich bin nicht sicher, ob dies THREAD ist, so könnte es nicht die Lösung für dich sein.

2

Verwenden Sie die 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

ich versuchen singleton Muster zu implementieren. Aber deine Version ist nicht threadsicher. Lesen Sie hier mehr: http://www.dofactory.com/Patterns/PatternSingleton.aspx. Versuchen Sie, diese Implementierung zu verwenden:

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 =()=>{}; 
} 

Nach myCodeBlock() Aufruf, sobald sie durch die Methode neu geschrieben werden, die nichts tut. Sie müssen noch sicherstellen, dass dieser Metode sicher aufgerufen wird - verwenden Sie lock oder was auch immer.

1

Wenn Sie Thread-sicher Code schreiben möchten und stellen Sie sicher, dass der Block nur einmal ausgeführt wird, können Sie so schreiben:

private System.Object lockThis = new System.Object(); 
public override MyObject Load() 
{ 
    lock (lockThis) { 
     if (!IsModelLoaded) 
     { 
      Model = MyService.LoadMyObject(Model); 
      IsModelLoaded = true; 
     } 
    } 
    return Model; 
}