Compartilhar via


Armazenamento Local de segmento: Campos estáticos de thread relativa e Slots de dados

Você pode usar o thread gerenciado armazenamento local (TLS) que é exclusivo para um domínio de thread e o aplicativo para armazenar dados. A.NET Framework fornece duas maneiras de usar gerenciado TLS: relativo de thread estáticos campos e dados slots.

  • Usar campos estáticos de thread relativa (relativa do segmento Shared campos de Visual Basic) se é possível prever exatamente às suas necessidades em tempo de compilação. Campos estáticos de thread relativo fornecem o melhor desempenho. Eles também oferecem os benefícios da verificação de tipos em tempo de compilação.

  • Use os slots de dados quando os requisitos reais podem ser descobertos somente em tempo de execução. Os slots de dados são mais lentos e mais complicado de usar do que os campos estáticos de relativa do segmento e os dados são armazenados como tipo de Object, portanto, você deve converter para o tipo correto antes de você usá-lo.

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

No .NET Framework versão 4, você pode usar o System.Threading.ThreadLocal<T> classe para criar objetos de segmento locais são inicializados ociosamente quando pela primeira vez em que o objeto é consumido. Para obter mais informações, consulte Inicialização lenta.

Exclusividade de dados gerenciado TLS

Se você usar campos estáticos de thread relativo ou slots de dados, dados gerenciados TLS serão exclusivos para a combinação do domínio de aplicativo e de thread.

  • Em um domínio de aplicativo, um segmento não pode modificar os dados de outro segmento, mesmo quando ambos os segmentos usam o mesmo campo ou o slot.

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

Por exemplo, se um thread define o valor de um campo estático relativa do segmento, entra em outro domínio de aplicativo e, em seguida, recupera o valor do campo, o valor recuperado no segundo domínio de aplicativo difere do valor no primeiro domínio de aplicativo. Definir um novo valor para o campo no segundo domínio de aplicativo não afeta o valor do campo no primeiro domínio de aplicativo.

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

Campos estáticos de thread relativo

Se você souber que uma parte dos dados é sempre exclusiva para um segmento e a combinação de domínio de aplicativo, aplicar o ThreadStaticAttribute atributo para o campo estático. Use o campo que você usaria qualquer outro campo estático. Os dados no campo são exclusivos para cada segmento que o utiliza.

Campos estáticos de thread relativo fornecem um desempenho melhor do que os slots de dados e tem o benefício de verificação de tipos em tempo de compilação.

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

Slots de dados

A.NET Framework fornece os slots de dados dinâmicos que são exclusivos 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.

Para ambos nomeado e sem nome slots, use o Thread.SetData e Thread.GetData métodos para definir e recuperar as informações no slot. Esses são os métodos estáticos que sempre atuam sobre os dados para o thread que está sendo executado-los.

Slots nomeadas podem ser convenientes, pois você pode recuperar o slot quando precisar, passando o seu nome para o GetNamedDataSlot método, em vez de manter uma referência a um slot sem nome. No entanto, se outro componente usa o mesmo nome para seu armazenamento de thread relativo e um segmento executa o código do seu componente e o outro componente, os dois componentes talvez uns dos outros dados corrompidos. (Este cenário pressupõe que ambos os componentes estão sendo executados 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