C'est un détail question pour C#.
Supposons que j'ai une classe avec un objet, et cet objet est protégé par une serrure:
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
return property;
}
set {
property = value;
}
}
Je tiens un bureau de vote thread pour être en mesure d'interroger cette propriété. Je veux aussi que le fil de mise à jour des propriétés de cet objet, de temps en temps, et parfois, l'utilisateur peut mettre à jour la propriété, et que l'utilisateur veut être en mesure de voir que la propriété.
Sera le code suivant verrouiller correctement les données?
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
lock (mLock){
return property;
}
}
set {
lock (mLock){
property = value;
}
}
}
Par "correctement", je veux dire, si je veux appeler
MyProperty.Field1 = 2;
ou quoi que ce soit, le champ sera verrouillé pendant que je fais la mise à jour? Est le paramètre qui est fait par l'opérateur = à l'intérieur de la portée de l' 'get' de la fonction, ou le 'get' de la fonction (et donc de la serrure) terminer premier, puis le réglage, puis " set " est appelée, contournant ainsi la serrure?
Edit: Depuis ce qui, apparemment, ne suffit pas, ce qui le fera? Ai-je besoin de faire quelque chose comme:
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
MyObject tmp = null;
lock (mLock){
tmp = property.Clone();
}
return tmp;
}
set {
lock (mLock){
property = value;
}
}
}
ce qui est plus ou moins juste fait en sorte que je n'ai accès à une copie, ce qui signifie que si je devais avoir deux threads appeler un " get " dans le même temps, ils auraient chacun commencent avec la même valeur de Champ1 (à droite?). Est-il un moyen de faire lire et écrire de verrouillage sur une propriété qui a du sens? Ou devrais-je viens de me contraindre à la fermeture de sections de fonctions plutôt que les données lui-même?
Juste pour que cet exemple prend tout son sens: Monobjet est un pilote de périphérique qui retourne l'état de manière asynchrone. J'ai envoyer des commandes via un port série, puis le dispositif répond à ces commandes dans son propre temps doux. Maintenant, j'ai un fil qui interroge pour son statut ("Êtes-vous encore là? Pouvez-vous accepter des commandes?"), un thread qui attend des réponses sur le port série ("je Viens de recevoir le statut de chaîne 2, tout est bon"), et puis le thread d'INTERFACE utilisateur qui prend en d'autres commandes ("Utilisateur veut vous faire cette chose.") et des postes, les réponses du pilote ("je viens de faire la chose, maintenant mise à jour de l'INTERFACE utilisateur avec qui"). C'est pourquoi je veux verrou sur l'objet lui-même, plutôt que les champs de l'objet; ce serait un grand nombre de verrous, a et b, et pas à chaque appareil de cette classe a le même comportement, il suffit de comportement, de sorte que j'aurais du code individuelle de la part des dialogues si je individualisée les verrous.