8
votes

Comment exécuter un bloc de code une seule fois sur un environnement multithreading?

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;
}


0 commentaires

7 Réponses :


-1
votes

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 :)

Edit: Je ne sais pas si c'est The Threadsafe, il pourrait donc ne pas être la solution pour vous.


0 commentaires

2
votes

Le plus simple serait d'ajouter xxx

mais sachez que cela met un verrou sur l'objet entier, pas seulement la méthode. Pas vraiment bonne pratique.

http : //msdn.microsoft.com/en-us/library/system.runtime.cpilerservices.methodimploption.aspx

synchronisé

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.


0 commentaires

4
votes

Utilisez le paresseux classe : xxx


0 commentaires

2
votes

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;
            }
        }
    }
}


0 commentaires

1
votes
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.

0 commentaires

1
votes

0 commentaires

2
votes

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;
}


0 commentaires