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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top