Domanda

Lettura documentazione msdn per dizionari che dice: " I membri pubblici statici (condivisi in Visual Basic) di questo tipo sono thread-safe. Non è garantito che tutti i membri dell'istanza siano thread-safe. & Quot;

Questi significano che con un dizionario come questo:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

Fare qualcosa come il codice qui sotto non è necessario?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
È stato utile?

Soluzione

Si riferisce a metodi statici sulla classe stessa. L'affermazione è in realtà la documentazione sulla caldaia aggiunta alla maggior parte delle classi. Il dizionario & Lt; & Gt; la classe in realtà non espone alcun metodo statico.

Dovrai serializzare tu stesso l'accesso alla tua classe di dizionario usando la parola chiave lock o forse anche un ReaderWriterLock. Il threading è un argomento piuttosto complesso e la parola chiave lock non è sempre appropriata. C'è un grande libro di Joe Duffy & Quot; Programmazione concorrente su Windows < !> quot; questo approfondisce la protezione delle risorse condivise dell'applicazione.

Altri suggerimenti

Stai fraintendendo " membri statici pubblici di questo tipo " come " istanze statiche pubbliche di questo tipo " ;.

Significa che se si chiama il metodo Add (un metodo di istanza) è meglio assicurarsi di avere accesso esclusivo al Dizionario utilizzando la propria semantica di blocco o serializzazione. Potrebbero accadere cose brutte se due thread modificano lo stato del tuo dizionario contemporaneamente ed è tua responsabilità assicurarti che ciò non accada. Non c'è nulla nel metodo Add del dizionario che farà questo blocco per te.

Se, tuttavia, chiami un metodo statico su Dizionario (di cui non ce ne sono di utili), allora staresti bene senza un lucchetto.

Questa è la regola generale per tutti i tipi .NET nel BCL.

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