Compartilhar via


Armazenamento local de thread: Campos estático relativa de thread e slots de dados

Você pode usar o thread gerenciado armazenamento local (TLS) exclusivo para um domínio de thread e aplicativo para armazenar dados.O .NET estrutura fornece duas maneiras de usar gerenciado TLS: relativo ao thread estático campos e dados slots.

  • Uso relativo a thread estático campos (relativo ao segmento Shared campos no Visual Basic) se você pode prever exatamente às suas necessidades em time de compilar. Relativo ao thread estático campos fornecem o melhor desempenho.Eles também oferecem os benefícios do time de compilar verificação de tipo.

  • Use dados slots quando seus requisitos real podem ser descobertos apenas em time de execução.Slots de dados são mais lentos e mais complicado que campos estático relativo ao thread e sistema autônomo dados são armazenados à medida que digita Object, portanto, você deve convertê-lo para o tipo correto antes de usá-lo.

No C++ não gerenciado, você usar TlsAlloc para alocar dinamicamente slots e __declspec(thread) para declarar que uma variável deve ser alocada no armazenamento de thread relativos. Slots de campos e dados estático relativos a thread fornecem a versão gerenciada esse comportamento.

Exclusividade dos dados no TLS gerenciado

Ao usar campos estático relativos a thread ou slots de dados, dados de TLS gerenciado são exclusivos para a combinação do domínio de thread e aplicativo.

  • Em um domínio do aplicativo, um thread não é possível modificar dados de outro segmento, mesmo quando dois threads usa o mesmo campo ou slot.

  • Quando um thread acessa o mesmo campo ou slot de vários domínios do aplicativo, um valor separado é mantido em cada domínio do aplicativo.

Por exemplo, se um thread define o valor de um campo estático thread relativos, entra em outro domínio do aplicativo e, em seguida, recupera o valor do campo, o valor recuperado no segundo domínio do aplicativo é diferente do valor no primeiro domínio do aplicativo.Configuração de um novo valor para o campo no segundo domínio do aplicativo não afeta o valor do campo no primeiro domínio do aplicativo.

Da mesma forma, quando um thread obtém o mesmo slot de dados nomeado em dois domínios de aplicativo diferente, os dados no primeiro domínio do aplicativo permanecem independentemente dos dados no segundo domínio do aplicativo.

Campos estático relativa de thread

Se você sabe que uma parte dos dados é sempre exclusiva de um thread e combinação de domínio de aplicativo, aplique o ThreadStaticAttribute o atributo para o campo estático. Use o campo conforme você usaria qualquer Outros campo estático.Os dados do campo são exclusivos para cada thread que o utiliza.

Campos estático relativos a thread fornecem um desempenho melhor do que os slots de dados e tem o benefício de verificação de tipos em time de compilar.

Esteja ciente de que qualquer código do construtor de classe será executado no primeiro thread no contexto do primeiro que acessa o campo.Em todos os outros threads ou contextos no mesmo domínio do aplicativo, os campos serão inicializados null (Nothing no Visual Basic) se eles são tipos de referência ou para seus padrões valores se eles forem valor tipos. Portanto, você não deve confiar em classe construtores para inicializar campos estático relativo ao thread.Em vez disso, evite inicializar campos estático relativo ao thread e assumir que eles são inicializados para null (Nothing) ou para seus valores padrão.

Slots de dados

O .NET estrutura fornece os slots de dados dinâmicos que são exclusivas de uma combinação de thread e o domínio de aplicativo.Há dois tipos de slots de dados: slots nomeados e slots sem nome.Ambos são implementados usando o LocalDataStoreSlot estrutura.

Slots de nomeados e sem nome, use o Thread.SetData e Thread.GetData métodos para conjunto e recuperar as informações no slot. Estes são os métodos estático que sempre atuam sobre os dados para o segmento que estiver atualmente executando-os.

Slots nomeados podem ser convenientes, porque você pode recuperar o slot quando necessário, passando o nome para o GetNamedDataSlot método, em vez de manter uma referência a um slot sem nome. No entanto, se o outro componente usa o mesmo nome para o armazenamento de thread relativo e um segmento executa o código do seu componente e o outro componente, os dois componentes podem corromper dados uns dos outros.(Este cenário pressupõe se ambos os componentes estão funcionando no mesmo domínio do aplicativo e que eles não são projetados para compartilhar os mesmos dados.)

Consulte também

Referência

ContextStaticAttribute

Thread.GetNamedDataSlot

ThreadStaticAttribute

CallContext

Outros recursos

Threads gerenciadas