Le bloc de code suivant effectue le chargement d'un objet en C #.
public bool IsModelLoaded { get; set; } public override MyObject Load() { if (!IsModelLoaded) { Model = MyService.LoadMyObject(Model); IsModelLoaded = true; } return Model; }
7 Réponses :
Créer un objet statique (comme un booléen) qui détermine si le code a couru ou non en la mettant dans une instruction IF :) P>
Edit: Je ne sais pas si c'est The Threadsafe, il pourrait donc ne pas être la solution pour vous. P>
Le plus simple serait d'ajouter mais sachez que cela met un verrou sur l'objet entier, pas seulement la méthode. Pas vraiment bonne pratique. P> http : //msdn.microsoft.com/en-us/library/system.runtime.cpilerservices.methodimploption.aspx p> synchronisé p> Spécifie que la méthode peut être exécutée par un seul fil à la fois. Les méthodes statiques verrouillent sur le type, alors que les méthodes d'instance verrouillent l'instance. Un seul thread peut exécuter dans l'une des fonctions d'instance, et un seul thread peut exécuter dans n'importe laquelle des fonctions statiques d'une classe. P> p>
J'essaie d'implémenter singleton code> motif. Mais votre version n'est pas la sécurité du fil. Lire la suite: http://www.dofactory.com/patterns/patternsingleton.aspx . Essayez d'utiliser cette implémentation:
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;
}
}
}
}
Action myCodeBlock = ()=> { //do your job //... myCodeBlock = ()=>{}; } After calling myCodeBlock() once it will be rewritten by method that does nothing. You still need to make sure this metod is called safely - use lock or whatever.
Si vous souhaitez écrire un code de sécurité de thread et assurez-vous que le bloc ne fonctionne qu'une seule fois, vous pouvez écrire comme ceci:
private System.Object lockThis = new System.Object(); public override MyObject Load() { lock (lockThis) { if (!IsModelLoaded) { Model = MyService.LoadMyObject(Model); IsModelLoaded = true; } } return Model; }