Pergunta

MSDN documentação para dicionários que diz: "estático Pública (Shared no Visual Basic) membros desse tipo são segmento seguro. Os membros de instância não são garantidos para ser thread-safe. "

Aqueles que isso significa que com um dicionário como este:


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

Está fazendo algo como o código abaixo desnecessário?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
Foi útil?

Solução

Ele está se referindo a métodos estáticos na própria classe. A afirmação é realmente documentação clichê adicionado a maioria das classes. A classe Dictionary <> na verdade não expor quaisquer métodos estáticos.

Você terá acesso serialize a sua classe dicionário si mesmo usando a palavra-chave de bloqueio ou talvez mesmo um ReaderWriterLock. Rosqueamento, porém, é um tema complexo bonita e a palavra-chave de bloqueio nem sempre é apropriado. Há um grande livro de Joe Duffy " Concurrent Programação no Windows " que entra em grande profundidade sobre a proteção de recursos de aplicativos compartilhados.

Outras dicas

Você interpretando mal "public static membros deste tipo" como "public static casos deste tipo".

Isso significa que se você chamar o método Add (um método de instância) é melhor você garantir que você tenha acesso exclusivo ao dicionário usando seus próprios bloqueio ou de serialização semântica. coisas ruins poderiam ocorrer se dois threads estão modificando o estado do seu dicionário, ao mesmo tempo, e é sua responsabilidade garantir que isso não aconteça. Não há nada dentro Add método do dicionário que vai fazer isso de bloqueio para você.

Se, no entanto, você chamar algum método estático no dicionário (de que não existem quaisquer os úteis), então você estaria bem sem um bloqueio.

Esta é a regra geral para todos os tipos .NET na BCL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top