Lokální úložiště vláken: statická pole a datové sloty ve vztahu k vláknůmThread Local Storage: Thread-Relative Static Fields and Data Slots

Pomocí spravovaného úložiště thread local (TLS) můžete ukládat data, která jsou jedinečná pro vlákno a doménu aplikace.You can use managed thread local storage (TLS) to store data that is unique to a thread and application domain. .NET Framework poskytuje dva způsoby použití spravovaného TLS: statická pole a datové sloty související s vláknem.The .NET Framework provides two ways to use managed TLS: thread-relative static fields and data slots.

  • Použijte statická pole související s vlákny (pole Shared relativních k vláknům v Visual Basic), pokud můžete v době kompilace odhadnout vaše přesné potřeby.Use thread-relative static fields (thread-relative Shared fields in Visual Basic) if you can anticipate your exact needs at compile time. Statická pole, která jsou v závislosti na vláknech, poskytují nejlepší výkon.Thread-relative static fields provide the best performance. Poskytují vám také výhody kontroly typu při kompilaci.They also give you the benefits of compile-time type checking.

  • Datové sloty můžete použít, pokud vaše skutečné požadavky mohou být zjištěny pouze v době běhu.Use data slots when your actual requirements might be discovered only at run time. Datové sloty jsou pomalejší a lépe nenáročné na použití než statická pole v závislosti na vláknech a data jsou ukládána jako typ Object, takže je musíte přetypovat na správný typ předtím, než je použijete.Data slots are slower and more awkward to use than thread-relative static fields, and data is stored as type Object, so you must cast it to the correct type before you use it.

V nespravovaném C++případě použijete TlsAlloc k dynamickému přidělování slotů a __declspec(thread) deklarovat, že by měla být proměnná přidělena v úložišti relativním pro vlákno.In unmanaged C++, you use TlsAlloc to allocate slots dynamically and __declspec(thread) to declare that a variable should be allocated in thread-relative storage. Statická pole a datové sloty související s vláknem poskytují spravovanou verzi tohoto chování.Thread-relative static fields and data slots provide the managed version of this behavior.

V .NET Framework 4 můžete použít třídu System.Threading.ThreadLocal<T> k vytvoření místních objektů vlákna, které jsou inicializovány laxně vytvářená při prvním použití objektu.In the .NET Framework 4, you can use the System.Threading.ThreadLocal<T> class to create thread-local objects that are initialized lazily when the object is first consumed. Další informace naleznete v tématu opožděná inicializace.For more information, see Lazy Initialization.

Jedinečnost dat ve spravovaném TLSUniqueness of Data in Managed TLS

Bez ohledu na to, jestli používáte statická pole nebo datové sloty související s vláknem, jsou data v spravovaném TLS jedinečná pro kombinaci vlákna a domény aplikace.Whether you use thread-relative static fields or data slots, data in managed TLS is unique to the combination of thread and application domain.

  • V rámci domény aplikace nemůže jedno vlákno upravovat data z jiného vlákna, a to i v případě, že obě vlákna používají stejné pole nebo slot.Within an application domain, one thread cannot modify data from another thread, even when both threads use the same field or slot.

  • Když vlákno přistupuje ke stejnému poli nebo pozici z více domén aplikace, zachová se v každé doméně aplikace samostatná hodnota.When a thread accesses the same field or slot from multiple application domains, a separate value is maintained in each application domain.

Například pokud vlákno nastaví hodnotu statického pole relativního k vláknu, přejde do jiné aplikační domény a potom načte hodnotu pole, hodnota načtená v druhé doméně aplikace se liší od hodnoty v první doméně aplikace.For example, if a thread sets the value of a thread-relative static field, enters another application domain, and then retrieves the value of the field, the value retrieved in the second application domain differs from the value in the first application domain. Nastavení nové hodnoty pro pole v druhé aplikační doméně nemá vliv na hodnotu pole v první aplikační doméně.Setting a new value for the field in the second application domain does not affect the field's value in the first application domain.

Podobně, pokud vlákno získá stejnou pojmenovanou datovou oblast ve dvou různých aplikačních doménách, data v první aplikační doméně zůstanou nezávislá na datech v druhé aplikační doméně.Similarly, when a thread gets the same named data slot in two different application domains, the data in the first application domain remains independent of the data in the second application domain.

Statická pole v závislosti na vláknechThread-Relative Static Fields

Pokud víte, že část dat je vždy jedinečná pro kombinaci vlákna a domény aplikace, použijte atribut ThreadStaticAttribute pro statické pole.If you know that a piece of data is always unique to a thread and application-domain combination, apply the ThreadStaticAttribute attribute to the static field. Použijte pole, jako byste použili jiné statické pole.Use the field as you would use any other static field. Data v poli jsou jedinečná pro každé vlákno, které ho používá.The data in the field is unique to each thread that uses it.

Statická pole v závislosti na vláknech poskytují lepší výkon než datové sloty a mají výhodu kontroly typu při kompilaci.Thread-relative static fields provide better performance than data slots and have the benefit of compile-time type checking.

Mějte na paměti, že jakýkoliv kód konstruktoru třídy se spustí v prvním vlákně v prvním kontextu, který přistupuje k poli.Be aware that any class constructor code will run on the first thread in the first context that accesses the field. Ve všech ostatních vláknech nebo kontextech ve stejné doméně aplikace budou pole inicializována na null (Nothing v Visual Basic), pokud se jedná o typy odkazů nebo na jejich výchozí hodnoty, pokud jsou typy hodnot.In all other threads or contexts in the same application domain, the fields will be initialized to null (Nothing in Visual Basic) if they are reference types, or to their default values if they are value types. Proto byste neměli spoléhat na konstruktory třídy pro inicializaci statických polí relativních k vláknům.Therefore, you should not rely on class constructors to initialize thread-relative static fields. Místo toho Vyhněte se inicializaci statických polí relativních ke vláknům a předpokládat, že jsou inicializovány na null (Nothing) nebo na jejich výchozí hodnoty.Instead, avoid initializing thread-relative static fields and assume that they are initialized to null (Nothing) or to their default values.

Datové slotyData Slots

.NET Framework poskytuje dynamické datové sloty, které jsou jedinečné pro kombinaci vlákna a aplikační domény.The .NET Framework provides dynamic data slots that are unique to a combination of thread and application-domain. Existují dva typy datových slotů: pojmenované sloty a nepojmenované sloty.There are two types of data slots: named slots and unnamed slots. Obě jsou implementovány pomocí LocalDataStoreSlot struktury.Both are implemented by using the LocalDataStoreSlot structure.

Pro pojmenované i nepojmenované sloty použijte metody Thread.SetData a Thread.GetData k nastavení a načtení informací v patici.For both named and unnamed slots, use the Thread.SetData and Thread.GetData methods to set and retrieve the information in the slot. Jedná se o statické metody, které vždy pracují s daty pro vlákno, které je právě spouští.These are static methods that always act on the data for the thread that is currently executing them.

Pojmenované sloty můžou být pohodlné, protože můžete načíst slot, když ho potřebujete, předáním jeho názvu metodě GetNamedDataSlot, namísto udržování odkazu na nepojmenované slot.Named slots can be convenient, because you can retrieve the slot when you need it by passing its name to the GetNamedDataSlot method, instead of maintaining a reference to an unnamed slot. Pokud však jiná komponenta používá stejný název pro své relativní úložiště vlákna a vlákno spustí kód z vaší komponenty i druhé komponenty, mohou tyto dvě součásti poškodit data každé druhé.However, if another component uses the same name for its thread-relative storage and a thread executes code from both your component and the other component, the two components might corrupt each other's data. (Tento scénář předpokládá, že obě komponenty jsou spuštěné ve stejné aplikační doméně a že nejsou navržené tak, aby sdílely stejná data.)(This scenario assumes that both components are running in the same application domain, and that they are not designed to share the same data.)

Viz také:See also