Il blocco alloca
-
10-07-2019 - |
Domanda
Ho letto da qualche parte, anche se non ricordo dove, che l'allocazione della parola chiave lock in C # può allocare.
So che il tentativo di bloccare un ValueType impacchetterà il valore, ma ci sono altre situazioni?
EDIT ::
- Tutti sembrano rispondere al caso di valore, lo so già!
- So anche cosa sono i lucchetti e come usarli in profondità, è un consiglio generale sulle migliori pratiche bello - ma inutile;)
- Ho bisogno di so perché sto costruendo un'app XNA per la distribuzione su xbox. La xbox Garbage Collector è molto lento - questo significa che devo mantenere allocazioni al minimo, preferibilmente inesistente (che impedisce il collezionista da sempre in esecuzione)
Soluzione
Mentre l'allocazione di see sync block internamente è pigra (ma questo è un dettaglio di implementazione che IIRC conosco dal "volume 1" di Essential.NET, o è CLR tramite C # - e dovrebbe essere trattato come quello), il semplice il caso dell'articolo che deve essere inscatolato come suggerito non si presenta - vedi Perché lock (< integer var >) non è consentito, ma Monitor.Enter (< integer var >) consentito?
Altri suggerimenti
Se stavi pensando di usare:
blocco (questa)
Dovresti saperlo perché stai cercando la tua istanza, i tuoi utenti la classe potrebbe anche bloccarsi e rovinarti. Che sia o meno un il problema dipende da cosa pensi che possano fare i tuoi utenti. La stessa situazione esiste se stai facendo:
Blocco (typeof (MyClass))
Se non vuoi farlo, puoi facilmente allocare una statica o un'istanza object (ovvero object myLock = new object ()), quindi bloccalo.
Per quanto riguarda il blocco di un tipo di riferimento vs tipo di valore , questo Domanda SO sul blocco di una risorsa quando ottenuta ... ha la risposta:
Dipende dal tipo - se a tipo di riferimento quindi sì, se un valore digitare n. Questo è anche il motivo per cui dovresti mai e poi mai bloccare un tipo di valore da allora il tipo di valore verrà inscatolato e qualsiasi tentativi successivi di bloccarlo il valore acquisirà effettivamente un blocco un oggetto diverso.
Definizione dell'istruzione lock:
Dichiarazione di blocco (Riferimenti per C #)
La parola chiave lock indica un'istruzione bloccare come una sezione critica da ottenere il blocco di mutua esclusione per un determinato oggetto, eseguendo a e quindi rilasciare il bloccare.
Questa una domanda SO sulla parola chiave lock in C # può essere d'aiuto. Puoi anche guardare Perché lock () è non consentito, ma Monitor.Enter () consentito?
La specifica per il compilatore definisce il comportamento di blocco in questo modo :
Il tipo di tempo di compilazione di espressione di una dichiarazione di blocco deve essere un tipo di riferimento o un > genere parametro (& # 167; 25.1.1) noto come a tipo di riferimento. È un tempo di compilazione errore per il tipo di tempo di compilazione di espressione per indicare un tipo di valore.