2011-08-06 8 views
3

je code partiel C# pour une file d'attente de blocage qui se présente comme suit:Comment verrouiller en toute sécurité cette propriété?

private bool flushed; 
private object _locker = new object(); 

public bool Flushed 
{ 
    get { lock (_locker) { return flushed; } } 
    set 
    { 
     lock (_locker) 
     { 
      flushed = value; 
      Monitor.Pulse(queue); 
     } 
    } 
} 

Le procédé Monitor.Pulse a une contrepartie dans le procédé Monitor.WaitDequeue() de la file d'attente de blocage.

Je souhaite ajouter une méthode qui signale la fin des données, qui vérifie la condition Flush. Il ressemblera à quelque chose comme ceci:

public bool EndOfData 
{ 
    get { lock (_locker) { return Flushed && (queue.Count == 0); } } 
} 

Voici ma question. Devrais-je appeler la propriété Flushed comme indiqué dans le code ci-dessus (en prenant un lock imbriqué), ou suffit-il de faire référence à la variable membre privé flushed directement, comme indiqué ci-dessous, en utilisant un seul verrou?

public bool EndOfData 
{ 
    get { lock (_locker) { return flushed && (queue.Count == 0); } } 
} 
+0

ne devrait pas faire de différence. –

+0

@Mitch: Donc la seule raison d'utiliser 'Flush' serait d'isoler mon code des changements logiques potentiels de la propriété' Flush' elle-même? –

+0

Robert: Oui ........ –

Répondre

2

Je ne pense pas que cela fait une différence, personnellement, j'utiliser la version imbriquée. Je pense que si quelque chose change dans la propriété réelle en l'utilisant, Flushed, vous assurer que tout est bon à faire.

Mais je crois vraiment que c'est un appel de préférence.

Questions connexes