SyncLock su SyncRoot
-
12-09-2019 - |
Domanda
Ho creato una coda sincronizzata e sto usando SyncLock sulla proprietà SyncRoot di quella coda quando invoco i metodi Enqueue / Dequeue. I metodi sono invocati da istanze di classi produttore / consumatore standard.
E 'questo un corretto utilizzo della proprietà SyncRoot?
sarebbe meglio la pratica di creare un oggetto condiviso privato in ogni classe e blocco su che invece?
Si prega di spiegare il vostro ragionamento.
Soluzione
Sì, questo è esattamente ciò che la proprietà è per SyncRoot
. In particolare, ciò significa che se si crea un'altra raccolta "wrapper", probabilmente utilizzare la stessa SyncRoot
, in modo che tutti possono ancora sincronizzare correttamente.
potrebbero creare il proprio oggetto di blocco, e che sarebbe assolutamente certi che nessun altro bloccata allo stesso tempo - ma significherebbe anche che altro codice non poteva lavorare in modo sicuro con la stessa collezione. Dipende molto dallo scenario - è altro codice in grado di utilizzare la stessa collezione? È che altro codice sotto il vostro controllo?
Si noti che si dovrebbe prendere un blocco per tutti operazioni, non solo Enqueue / Dequeue. In particolare, se si vuole iterare la raccolta si dovrebbe tenere il blocco per questo tutto il tempo, come un cambiamento nel mezzo non invalidare l'iteratore.